C# - Drag and Drop megvalósítása a C#-ban

forráskód letöltése
Sok esetben könnyíthetjük meg alkalmazásunk kezelhetőségét, ha programjainkban használunk Drag and Drop-ot. Mellékelt példában e technikának gyakorlati megvalósítását vesszük szemügyre.
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-re kattint. Ekkor jön létre az 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-é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).
     protected void label1_MouseDown (object sender, System.WinForms.MouseEventArgs e)
      {
        this.DoDragDrop((sender as Label).Text, DragDropEffects.Move);
      }
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.
      protected void textBox1_DragEnter (object sender, System.WinForms.DragEventArgs e)
      {
        (sender as TextBox).BackColor = Color.Yellow;
      }
Amikor elhagyja annak területét, akkor a DragLeave esemény keletkezik.
      protected void textBox1_DragLeave (object sender, System.EventArgs e)
      {
        (sender as TextBox).BackColor = Color.White;
      }
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.
      protected void textBox1_DragOver (object sender, System.WinForms.DragEventArgs e)
      {
        e.Effect = DragDropEffects.Move;
      }
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-é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.
      protected void textBox1_DragDrop (object sender, System.WinForms.DragEventArgs e)
      {
        (sender as TextBox).Text = e.Data.GetData(DataFormats.Text).ToString();
        (sender as TextBox).BackColor = Color.White;
      }