Drag&Drop dla RichTextBox

0

Cześć,

Mam problem z ustawieniem Drag&Dropa dla RichTextBox-a. Oczywiscie ustawiłem:

this.AllowDrop = true;

poustawiałem akcje

        void RichTextBoxDrop_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(String)))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

oraz

        void RichTextBoxDrop_DragDrop(object sender, DragEventArgs e)
        {
            
            int i;
            String s;

            // Get Start Position to Drop the Text  
            i = this.SelectionStart;
            s = this.Text.Substring(i);
            this.Text = this.Text.Substring(0, i);

            // Drop the Text on the RichTextBox
            this.Text = this.Text + e.Data.GetData("Text").ToString();
            this.Text = this.Text + s;      

        }

i niby wszystko działa... Kontrolka przyjmuje mi tekst z np. FireFoxa czy innej aplikacji. Nie przyjmuje mi natomiast gdy chce wkleić wartość "Text" z np. Label-a. Po najechaniu nim na RichTextBoxa mam cały czas kursor przekreślonego kółka. Próbowałem na różne sposoby szukałem w internecie ale nic nie znalazłem. Debuggerem doszedłem tylko do wniosku, że akcja "DragEnter" jest odpalana i ustawiany jest e.Effect = DragDropEffects.Copy; tak jak powinien. Po tym nie odpala się niestety "DrgDrop".

Będę wdzięczny za pomoc. Pozdrawiam

0

jak inicjujesz drag'n'drop z label?

0

A no nie napisałem o tym, więc już piszę. Chwile temu doszedłem do tego iż jeśli odpalę DoDragDrop z eventa MouseDown kursor myszki zachowuje się poprawnie i zmienia się sam automatycznie na "przekreślone kółko" ale nic się nie dzieje po upuszczeniu go w RichTextBox-ie

void LabelDrag_MouseDown(object sender, MouseEventArgs e)
        {
            this.DoDragDrop((sender as Label).Text, DragDropEffects.Copy);
        }

Natomiast jak odpalę DoDragDrop-a z MouseUp to kursor się nie zmienia, ale po przejechaniu nim "w ciemno" na RichBox-a i upuszczeniu tekst się wkleja. Nie ma niestety tylko kontroli widocznej nad aktualnym kursorem tekst w RichBoxie oraz cały czas jest zwykły kursor myszki

void LabelDrag_MouseUp(object sender, MouseEventArgs e)
        {
            this.DoDragDrop((sender as Label).Text, DragDropEffects.Copy);
        }

Testowałem takie same ustawienia pomiędzy dwoma Labelami i wszystko zachowuje się poprawnie (MouseDown a potem akcja DragEnter...).

0

Dobra już sam zrobiłem. Więc rozwiązanie dla potomnych:

RichTextBox domyślnie nie ma publicznego Eventu DragOver i w niezrozumiały sposób ustawia wszystkim typom obiektów z aplikacji na
e.Effect = DragDropEffects.None
Przyjmuje tylko Drag&Drop z zewnątrz np. FireFox czy WordPad

Trzeba overridować eventa:

        protected override void OnDragOver(DragEventArgs drgevent)
        {
           // base.OnDragOver(drgevent);
            if (drgevent.Data.GetDataPresent(DataFormats.Text))
            {
                drgevent.Effect = DragDropEffects.Copy;
            }
            else
                drgevent.Effect = DragDropEffects.None;
        }

i wtedy zachowuje się tak jak my tego chcemy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1