A példában a Form-ra helyezett ListBox kontrol fölé vonszolhatunk egy tetszőleges állományt, melyről ezt követően információkat jelenítünk meg a kontrolban. A művelet során egyszerre több állományt is vonszolhatunk.
A megoldáshoz két kezelőfüggvényre van szükségünk, melyekkel a vonszolás eseménye elkapható, és a művelet elvégezhető. Az első eseménykezelő a DragEnter, mely annak az eseménynek a kezelője, amikor az objektumot a kontrol fölé mozgatjuk. A másik kezelő ahhoz az eseményhez kapcsolható, amikor az objektumot elengedjük a kontrol felett.
A delegáltak mindegyike DragEventHandler típusú, a kezelőfüggvények eseménytől függő paramétere DragEventArgs típusúak.
Az objektum kontrol fölé mozgatásának eseményét kezelő metódusban felhasználjuk az utóbb említett paraméter Data property-jét, melynek segítségével lekérdezhetünk információkat az érkező objektummal kapcsolatban.
private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
A Data property IDataObject típusú, mely rendelkezik egy GetDataPresent nevű metódussal, mellyel lekérdezhetjük az érkező objektum típusára vonatkozó információkat, és meghatározhatjuk, hogy csak a kívánt típusú elemeket fogadjuk.
If (e.Data.GetDataPresent(DataFormats.FileDrop, false))
{
e.Effect = DragDropEffects.All;
}
}
A példában úgy jártunk el, hogy amennyiben a DataFormats enumerátor értéke FileDrop, vagyis egy fájl a vonszolt objektum, akkor engedélyezünk mindennemű, az eseménnyel kapcsolatos effektust.
A DragDropEffects felsorolt típus számtalan elemének segítségével engedélyezhetjük az összes műveletet - ahogy azt példánkban tettük -, de le is tilthatjuk valamennyit a None elem megadásával.
A másik esemény kezelőmetódusában következhet az állomány feldolgozása. A DragEventArgs típusú paraméter imént használt Data property-je mögött elérhető objektum GetData metódusának segítségével lehetőségünk van a kapott objektum(ok)ról információt szerezni, és ezt egy karakterlánc-tömbben eltárolni.
private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
listBox1.Items.Clear();
string[] f = (string[])e.Data.GetData(DataFormats.FileDrop);
Amennyiben a kontrolba csak egyetlen objektumot vonszolunk, akkor csak egy elemmel fog a tömb rendelkezni.
A tömb elemein végighaladva kivesszük a kapott karakterláncot, mely a vonszolt állomány elérési útvonalát tartalmazza kapott információként.
Ennek eredményeképpen már könnyen létrehozhatunk vele egy FileInfo objektumot, melynek property-jeit lekérdezve hasznos adatokhoz juthatunk a vonszolt állományról, amelyeket megjelenítünk a ListBox kontrolban.
foreach(string file in f)
{
FileInfo fi = new FileInfo(file);
listBox1.Items.Add("Fájl: " + fi.FullName);
...
}
}