Drag und Drop II

  • im Beispiel wird zw. 2 Listviews ein String zwischen 2 ListViews 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 den Text kopieren
            lvListView.DoDragDrop(lviItem.Text, 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;

    // prüfen, ob ein Text vorhanden ist
    if (e.Data.GetDataPresent(DataFormats.Text))
    {
        e.Effect = DragDropEffects.Copy;
    }
}

// wenn das DragDrop-Element "fallen" gelassen wird
private void ListViewDest_DragDrop(object sender, DragEventArgs e)
{
    // String abholen
    string sDataString = e.Data.GetData(DataFormats.StringFormat) as string;

    bool bFound = false;

    // nachschauen, ob schon im ListView vorhanden
    foreach (ListViewItem li in ListViewDest.Items)
    {
        if (li.Text == sDataString)
        {
            bFound = true;
            break;
        }
    }

    // wenn nicht vorhanden
    if (bFound == false)
    {
        // dann neues ListViewItem einfügen
        ListViewDest.Items.Add(sDataString);
    }
}