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
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
Ustaw właściwość AllowDrop na true.
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.
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ż
.NET Desktop feedback