Udostępnij za pośrednictwem


Przewodnik: wykonywanie operacji przeciągania i upuszczania w formularzach systemu Windows

Aby wykonać operacje przeciągania i upuszczania w aplikacjach opartych na systemie Windows, należy obsługiwać serię zdarzeń, w szczególności zdarzenia DragEnter, DragLeavei DragDrop. Pracując z informacjami dostępnymi w argumentach tych zdarzeń, można łatwo umożliwić operacje przeciągania i upuszczania.

Przeciąganie danych

Wszystkie operacje przeciągania i upuszczania rozpoczynają się od przeciągania. Funkcjonalność umożliwiająca zbieranie danych podczas rozpoczynania przeciągania jest implementowana w metodzie DoDragDrop.

W poniższym przykładzie zdarzenie MouseDown służy do uruchamiania operacji przeciągania, ponieważ jest to najbardziej intuicyjne (większość akcji przeciągania i upuszczania rozpoczyna się od naciśnięcia myszy). Należy jednak pamiętać, że każde zdarzenie może służyć do zainicjowania procedury przeciągania i upuszczania.

Notatka

Niektóre kontrolki mają niestandardowe zdarzenia specyficzne dla przeciągania. Na przykład kontrolki ListView i TreeView mają zdarzenie ItemDrag.

Aby rozpocząć operację przeciągania

  1. W zdarzeniu MouseDown dla kontrolki, w której rozpocznie się przeciąganie, użyj metody DoDragDrop, aby ustawić dane do przeciągnięcia oraz określić dozwolony efekt przeciągania. Aby uzyskać więcej informacji, zobacz Data i AllowedEffect.

    W poniższym przykładzie pokazano, jak zainicjować operację przeciągania. Kontrolka, w której rozpoczyna się przeciąganie, to kontrolka Button, przeciągane dane to ciąg reprezentujący właściwość Text kontrolki Button, a dozwolone efekty są kopiowane lub przenoszone.

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown  
       Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)  
    End Sub  
    
    private void button1_MouseDown(object sender,
    System.Windows.Forms.MouseEventArgs e)  
    {  
       button1.DoDragDrop(button1.Text, DragDropEffects.Copy |
          DragDropEffects.Move);  
    }  
    

    Notatka

    Dowolne dane mogą być używane jako parametr w metodzie DoDragDrop; w powyższym przykładzie użyto właściwości Text kontrolki Button (niezamiast ręcznego wpisania wartości lub pobierania danych z zestawu danych), ponieważ właściwość była powiązana z miejscem, z którego przeciągano (kontrolka Button). Miej to na uwadze podczas wprowadzania operacji przeciągania i upuszczania w aplikacjach dla systemu Windows.

Podczas gdy operacja przeciągania jest wykonywana, można obsłużyć zdarzenie QueryContinueDrag, które prosi system o pozwolenie na kontynuowanie operacji przeciągania. Podczas używania tej metody jest to również odpowiedni moment, aby wywołać metody, które będą miały wpływ na operację przeciągania, na przykład rozwinięcie TreeNode w kontrolce TreeView, kiedy kursor na nią najedzie.

Pomijanie danych

Po rozpoczęciu przeciągania danych z lokalizacji na formularzu lub kontrolce systemu Windows, będziesz chciał w naturalny sposób je tam upuścić. Kursor zmieni się po przekroczeniu obszaru formularza lub kontrolki, która jest poprawnie skonfigurowana do usuwania danych. Dowolny obszar w formularzu systemu Windows lub kontrolce można sprawić, że będzie akceptować przeciągnięte dane, ustawiając właściwość AllowDrop i obsługując zdarzenia DragEnter i DragDrop.

Aby wykonać upuszczenie

  1. Ustaw właściwość AllowDrop na true.

  2. W przypadku DragEnter dla kontrolki, w której wystąpi spadek, upewnij się, że przeciągane dane są akceptowalnym typem (w tym przypadku Text). Następnie kod ustawia efekt, który wystąpi, gdy spadek wystąpi do wartości w wyliczenie DragDropEffects. Aby uzyskać więcej informacji, zobacz Effect.

    Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter  
       If (e.Data.GetDataPresent(DataFormats.Text)) Then  
         e.Effect = DragDropEffects.Copy  
       Else  
         e.Effect = DragDropEffects.None  
       End If  
    End Sub  
    
    private void textBox1_DragEnter(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       if (e.Data.GetDataPresent(DataFormats.Text))
          e.Effect = DragDropEffects.Copy;  
       else  
          e.Effect = DragDropEffects.None;  
    }  
    

    Notatka

    Możesz zdefiniować własne DataFormats, określając własny obiekt jako parametr Object metody SetData. Upewnij się, że podczas wykonywania tej czynności określony obiekt jest serializowalny. Aby uzyskać więcej informacji, zobacz ISerializable.

  3. W przypadku zdarzenia DragDrop dla kontrolki, w której wystąpi spadek, użyj metody GetData, aby pobrać przeciągane dane. Aby uzyskać więcej informacji, zobacz Data.

    W poniższym przykładzie kontrolka TextBox jest kontrolką, do której jest przeciągany obiekt (gdzie nastąpi upuszczenie). Kod ustawia właściwość Text kontrolki TextBox równą przeciąganym danym.

    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop  
       TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString  
    End Sub  
    
    private void textBox1_DragDrop(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();  
    }  
    

    Notatka

    Ponadto można pracować z właściwością KeyState, tak aby w zależności od wciśniętych klawiszy podczas operacji przeciągania i upuszczania wystąpiły pewne efekty (na przykład standardowo kopiuje się przeciągnięte dane po naciśnięciu klawisza CTRL).

Zobacz też