4. Drag And Drop

V dnešní době hojně používaná metoda pro přesouvání nebo kopírování položek by neměla v našem kurzu aplikací pro Windows chybět.

V zásadě se pro realizaci operace Drag And Drop mezi ovládacími prvky používají tři události. V případě prvků TreeView a ListView se používají události ItemDrag, DragEnter a DragDrop. V případě jiných komponent, jako například ListBox, se místo události ItemDrag používá událost MouseDown. Kromě toho musejí mít všechny prvky, do kterých chceme položky přetahovat, nastavenu vlastnost AllowDrop na true. Následně se v události ItemDrag zavolá metoda DoDragDrop().

Mějme příklad, ve kterém budeme chtít přetahovat položky z komponenty ListView do komponenty TreeView.

Vytvoříme tedy patřičný formulář. Do něj přidáme obsluhu události pro moment, kdy uživatel uchopí položku v prvku ListView (ItemDrag).

[ukázka kódu]
this.listView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.listView1_ItemDrag);

Následující kód ukáže volání metody pro prvek TreeView (do něj se zde přetahují prvky) v obsluze události ItemDrag. Ta má jako druhý argument instanci typu ItemDragEventArgs, tedy můžeme z ní získat data typu object, která jsou přenášena (vlastnost Item). Jelikož víme, že budeme přetahovat pouze jméno položky v prvku ListView, můžeme provést explicitní přetypování na prvek ListViewItem a přímo vybrat text prvku.

[ukázka kódu]
private void listView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e) {
  string sItem = ((ListViewItem)e.Item).Text;
  // start operace drag & drop
  DoDragDrop(sItem, DragDropEffects.Copy | DragDropEffects.Move);
}

Teď víme, jaká data se tedy budou přenášet. Nyní je třeba nastavit, co se stane, když se dokončí přetahování objektu myší. To se nastaví v obsluze události DragDrop. V ní nejprve získáme data přenášená událostí a posléze je zpracujeme. V těchto typech událostí se jako argumenty přenášejí i souřadnice, na kterých skončilo přetahování. Tyto souřadnice vybereme a zjistíme, na kterou položku v našem prvku (TreeView) ukazovaly.

[ukázka kódu]
private void treeView1_DragDrop(object sender, DragEventArgs e) {
  Point position = new Point(0, 0);
  // ziskam data prenasena z argumentu udalosti
  string s = (string)e.Data.GetData(typeof(string));

  // zjistim pozici, u ktere se prestalo pretahovat
  Position.X = e.X;
  Position.Y = e.Y;

  // zjistim pozici uzlu a nasledne uzel, u ktereho se prestalo pretahovat
  // (pustilo se tlacitko mysi)
  position = treeView1.PointToClient(position);

Pokud daná pozice vyhovuje našim podmínkám, můžeme přetahovaná data vložit.

[příklad ke stažení]

Tento příklad na Drag&Drop je k dispozici ke stažení v souboru zip zde.