Angeklicktes ListView Item / SubItem und dessen Zeilen- und Spaltenindex per Mausklick herausfinden

private void ListView1_MouseUp(object sender, MouseEventArgs e)
{
   ListViewHitTestInfo htInfo = ListView1.HitTest(e.X, e.Y);

   if (htInfo != null)
   {
        if (htInfo.Item != null && htInfo.SubItem != null)
        {
            ListViewItem lvi = htInfo.Item;
            ListViewItem.ListViewSubItem lvsi = htInfo.SubItem;

            // akt. Zeilenindex
            int iRow = lvi.Index;
            // akt. Spaltenindex
            int iCol = lvi.SubItems.IndexOf(htInfo.SubItem);

            string sLocation = htInfo.Location.ToString();
            string sSubItem = lvsi.Text;
        }
   }
}

Farben (Color) und Schriftarten (Font) der Zeilen (ListViewItem) und Spalten (ListViewSubItem) eines ListViews anpassen

Im ersten Beispiel wird ein bestehendes ListViewsItem komplett eingefärbt.

// das erste ListViewItem in der Liste nehmen und eine Farbe zuweisen
ListViewItem lvi = ListView1.Items[0];
lvi.ForeColor = SystemColors.WindowText;

Im zweiten Beispiel wird eine komplette Zeile (ListViewItem) eines ListViews hinzugefügt und blau gefärbt.

// ListViewItem mit drei Spalten hinzufügen
// vorrausgesetzt, das ListView hat die Eigenschaft
// ListView1.View = View.Details;
// in diesem Fall wird das ListViewItem blau gefärbt, der Hintergrund ist eine Systemfarbe,
// Schrift ist die eingestellte vom ListView
ListView1.Items.Add(new ListViewItem(new string[] { "item", "value", "remark" }, 0, Color.Blue, SystemColors.Window, ListView1.Font ));

Im dritten Beispiel wird ein ListViewItem hinzugefügt und jede Spalte (SubItem) des ListViewsItems verschieden gefärbt.

// ListViewItem mit drei Spalten hinzufügen
// vorrausgesetzt, das ListView hat die Eigenschaft
// ListView1.View = View.Details;
// Spalte 0 == rot, der Hintergrund ist die eingestellte Hintergrundfarbe,
// Spalte 1 == grün, der Hintergrund ist die eingestellte Hintergrundfarbe,
// Spalte 0 == gelb, der Hintergrund ist die eingestellte Hintergrundfarbe,
// Schrift ist immer die eingestellte vom ListView
ListViewItem lvi = new ListViewItem(new string[] { "Spalte 0" }, 0, ListView1.BackColor, Color.Red, ListView1.Font);
lvi.UseItemStyleForSubItems = false; // wichtig, damit die eingenen Farbeinstellungen angenommen werden
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, "Spalte 1", ListView1.BackColor, Color.Green, ListView1.Font));
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, "Spalte 2", ListView1.BackColor, Color.Yellow, ListView1.Font));
ListView1.Items.Add(lvi);

Update-Funktion eines ListView beeinflussen

// Neuzeichnen verhindern
ListView1.BeginUpdate();

// Inhalt des Listview löschen
ListView1.Items.Clear();

// irgendwas in das Listview füllen
foreach ( ... )
{
    ListView1.Items.Add(new ListViewItem(new string[] { "1", "2", "3" }));
}

// Neuzeichnen wieder einschalten
ListView1.EndUpdate();

Items und SubItems zu ListView hinzufügen

// ListViewItem mit drei Spalten hinzufügen
// vorrausgesetzt, das ListView hat die Eigenschaft
// ListView1.View = View.Details;
ListView1.Items.Add(new ListViewItem(new string[] { "item", "value", "remark" }));

oder

// Item anlegen
ListViewItem lvi = new ListViewItem("item");
// 1. SubItem
lvi.SubItems.Add("value");
// 2. SubItem
lvi.SubItems.Add("remark");
// Items hinzufügen
ListView1.Items.Add(lvi);

Items auf Tastendruck (ENTF) löschen

// ListView1 -> MultiSelect == true beachten!
private void ListView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        while (ListView1.SelectedItems.Count > 0)
        {
            ListView1.Items.Remove(ListView1.SelectedItems[0]);
        }
    }
}

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);
    }
}

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);
        }
    }
}

Dateien eines Ordners in einem ListView auflisten

// füllt ListView1 mit Dateien mit der Dateiendung *.avi
private bool ListFiles(string sDir)
{
    bool bRetVal = false;

    ListView1.Items.Clear();

    try
    {
        DirectoryInfo di = new DirectoryInfo(sDir);

        FileInfo[] rgFiles = di.GetFiles("*.avi");

        foreach (FileInfo fi in rgFiles)
        {
            ListView1.Items.Add(fi.Name);
        }

        bRetVal = true;
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception: " + e.Message);  
        Console.WriteLine("StackTrace: " + e.StackTrace);
    }

    return bRetVal;
}