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).
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.
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.
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.
Tento příklad na Drag&Drop je k dispozici ke stažení v souboru zip zde. |