C# - Vezérlőkre vonszolt állományok feldolgozása

forráskód letöltése
A különböző objektumok vonszolásával kapcsolatos műveletek igen sokszínűek lehetnek, amelyhez a .NET Framework jól definiált infrastruktúrát biztosít. Cikkünkben bemutatjuk, hogy mi történik, ha egy állományt vonszolunk az alkalmazás egy kontrolja fölé, majd ott eldobjuk. A példából kiderül, hogy milyen információ válik elérhetővé az állományról a művelet végén.
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);
    ...
  }
}