Drag und Drop

  • im Beispiel wird zw. 2 Listviews ein Listitem per Drag & Drop ausgetauscht
  • dabei ist beim Quell-ListView das Ereignis ItemDrag zu behandeln:
private void ListViewSrc_ItemDrag(object sender, ItemDragEventArgs e)
{
    // ListView ermitteln
    ListView lvListView = sender as ListView;

    ListViewItem lviItem = null;

    if (lvListView != null)
    {
        // selektiertes Item des Listviews herausfinden,
        // hier wird nur das erste behandelt (im Falle vom
        // ListViewSrc.MultiSelect = true muss man die anderen
        // Items extra abfangen)
        if (lvListView.SelectedItems.Count == 1)
        {
            lviItem = lvListView.SelectedItems[0];
        }

        // wenn ein Item vorhanden
        if (lviItem != null)
        {
            // dann DoDragDrop des ListViews ausführen und das Item kopieren
            lvListView.DoDragDrop(lviItem, DragDropEffects.Copy);
        }
    }
}
  • beim Ziel-ListView muss die Eigenschaft AllowDrop = True gesetzt sein
  • zusätzlich sind die Ereignisse DragOver und DragDrop zu behandeln:
// Was soll passieren, wenn man mit dem Mauszeiger
// ein Element auf das Listview zieht?
private void ListViewDest_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.None;

    // wenn das Element ein ListViewItem ist
    ListViewItem lviItem = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;

    if (lviItem != null)
    {
        // dann eine Kopie davon erlauben
        e.Effect = DragDropEffects.Copy;
    }
}

// wenn das DragDrop-Element "fallen" gelassen wird
private void ListViewDest_DragDrop(object sender, DragEventArgs e)
{
    ListViewItem lviItem = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;

    // wenn das Element ein ListViewItem ist
    if (lviItem != null)
    {
        bool bFound = false;

        // prüfen, ob schon in der Liste von ListViewDest
        foreach (ListViewItem li in ListViewDest.Items)
        {
            if (li.Text == lviItem.Text)
            {
                bFound = true;
                break;
            }
        }

        // wenn noch nicht in ListViewDest, dann einfügen
        if (bFound == false)
        {
            ListViewDest.Items.Add(lviItem.Text);
        }
    }
}