A megvalósítandó feladat a következő: adott tetszőleges számú Label komponens, melyeknek szövegét (Text property) kellene Drag and Drop-al „beírni” szintén a Form-on található tetszőleges számú TextBox komponensbe.
Ebben az esetben, amikor több forrás és több cél is lehet, a legegyszerűbb megvalósítás a Drag and Drop.
Nézzük miként valósítható meg a fenti feladat attól kezdve, hogy a Label és TextBox komponens a Form-ra került.
A Drag and Drop-ot akkor kell indítanunk, mikor a felhasználó valamely Label-ra kattint. Ekkor jön létre a MouseDown esemény. Az összes Label komponenshez most ugyanazt az eseménykezelő függvényt rendeljük hozzá. Ez lesz az a pont, amikor a Drag and Drop műveletet indítjuk, méghozzá a DoDragDrop függvény hívásával. Ez a függvény minden RichControl osztályból származó osztályban rendelkezésre áll. Első paraméterként egy tetszőleges adatot adhatunk át későbbi felhasználásra, Object típusként. Mi most az adott Label komponens Text property-jének értékét adjuk át, mivel a későbbiekben majd ezt a szöveget kell beírnunk a TextBox-ba. Második paraméterként a DragDropEffects felsorolt típus egyik elemét adhatjuk át, meghatározva ezzel a Drag and Drop művelet milyenségét (All, Copy, Move, None, Scroll).
Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown, Label2.MouseDown, Label3.MouseDown
If sender Is Label1 Then
DoDragDrop(Label1.Text, DragDropEffects.Move)
End If
Ekkor már meg is változik az egér kurzor alakja jelezve a felhasználó számára, hogy Drag and Drop művelet van folyamatban.
A következő lépésre akkor lesz szükségünk, mikor a felhasználó az egérrel valamely TextBox komponens fölé ér. A példa kedvéért a TextBox komponenseknél létrehoztuk mind a négy Drag and Drop-al kapcsolatos eseményének kezelő függvényét. Mindegyik TextBox-hoz ugyanazt a függvényt rendeltük, mivel a végrehajtandó funkció is azonos. Nézzük sorra ezeket az eseményeket:
A DragEnter esemény jön létre akkor, ha a felhasználó Drag and Drop közben az egérrel a komponensünk területe fölé ér.
Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter, TextBox2.DragEnter, TextBox3.DragEnter
If sender Is TextBox1 Then
TextBox1.BackColor = Color.Yellow
End If
Amikor elhagyja annak területét, akkor a DragLeave esemény keletkezik.
Private Sub TextBox1_DragLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.DragLeave, TextBox2.DragLeave, TextBox3.DragLeave
If sender Is TextBox1 Then
TextBox1.BackColor = Color.White
End If
Hasonlóan a DragEnter-hez a DragOver is az egér „megérkezésekor” aktivizálódik. Ebben az eseményben kell viszont eldöntetnünk azt, hogy a Drag and Drop-ot elfogadjuk-e vagy elutasítjuk. Ehhez a paraméterként kapott „e” változónak kell értéket adnunk. Ez a változó DragEventArgs típusú osztály lesz, mely rendelkezik egy Effect property-vel. Ennek a már ismert DragDropEffects egyik értékét adhatjuk, mellyel jelezhető, hogy a Drag and Drop elfogadott-e vagy sem. További tulajdonságai a DragEventArgs osztálynak még az X, Y property, melyből az egér aktuális pozíciója tudható meg, vagy a Data property mely Object típusú, és azt az adatot képviseli, melyet a Drag and Drop indításakor a DoDragDrop függvény első paraméterének átadtunk. Másik fontos property lehet még a KeyState, melyből megállapítható, hogy a Drag and Drop közben a Shift, Ctrl, vagy az Alt gombok valamelyike, esetleg azok kombinációja lenyomott állapotban van-e vagy sem.
Private Sub TextBox1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragOver, TextBox2.DragOver, TextBox3.DragOver
e.Effect = DragDropEffects.Move
End Sub
Amikor a felhasználó egy Drag and Drop közben egy adott komponensen elengedi az egér gombját, akkor jön létre a DragDrop esemény. Itt ugyanúgy kapunk egy DragEventArgs változót, melyből megtudhatjuk mindazt, amit a DragOver eseménynél is. Mellékelt példában ez lesz az a pont, amikor az adott TextBox szövegének értéket kell adnunk a kapott paraméter alapján. Ehhez az „e” változó Data property-jére van szükségünk, melyben a GetData függvény szolgáltatja a kérdéses értéket. Ennek paraméterként meg kell adnunk, hogy a tárolt adat Text formájú. Ehhez a DataFormats felsorolt típust kell használnunk.
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop, TextBox2.DragDrop, TextBox3.DragDrop
If sender Is TextBox1 Then
TextBox1.BackColor = Color.White
TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString()
End If