Elemente werden nicht vollständig aus ListView gelöscht
-
Hi Leute!
Auch wenn ich mir einbilde, dass ich gerade bei logischen Sachen nicht wirklich schlecht bin habe ich doch massive Probleme alle markierten Elemente aus einer ListView zu löschen.
Könnt ihr mir bitte sagen woran das liegt? Der Code sieht so aus (stark vereinfacht aber trotzdem das selbe Grundproblem):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace LvTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); ListView1.View = View.Details; ListView1.LabelEdit = false; ListView1.AllowColumnReorder = true; ListView1.CheckBoxes = true; ListView1.FullRowSelect = true; ListView1.GridLines = true; ListView1.Sorting = SortOrder.Ascending; ListView1.Columns.Add("Test", -2, HorizontalAlignment.Left); ImageList imageListSmall = new ImageList(); ImageList imageListLarge = new ImageList(); ListView1.LargeImageList = imageListLarge; ListView1.SmallImageList = imageListSmall; this.Controls.Add(ListView1); for (int i = 0; 3 > i; i++) { ListViewItem item1 = new ListViewItem("Test", 0); item1.SubItems.Add("Test"); ListView1.Items.AddRange(new ListViewItem[] { item1 }); } } private void btnDelete_Click(object sender, EventArgs e) { MessageBox.Show("Gesamtzahl: " + ListView1.Items.Count); MessageBox.Show("Markierte: " + ListView1.CheckedItems.Count); for (int i = 0; ListView1.Items.Count >= i; i++) { MessageBox.Show("Durchgelaufen: " + i); if (ListView1.CheckedItems[i].Checked == true) { MessageBox.Show("Gelöscht: " + i); try { ListView1.CheckedItems[i].Remove(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Fehler!"); } } } } } }
Danke für eure Bemühungen! Viele Grüße, der Earnie
-
...
-
ich habe selten so eine treffende antwort erhalten :-)))
-
Ich vermute, dass das Löschen die markierten Elemente ändert (d.h. die Markierungen alle entfernt). Ich würde daher an Deiner Stelle im ersten Schritt die markierten Elemente in eine Liste kopieren und dann anhand dieser Liste alle löschen.
-
[Edit] Mist geschrieben
[Edit2]
Entweder so wie Konrad unten schrieb oder die Items von hinten durchlaufen.
Etwa so:for (int i = listView1.Items.Count-1; i >= 0; i--) { MessageBox.Show("Durchgelaufen: " + i); if (listView1.Items[i].Checked == true) { MessageBox.Show("Gelöscht: " + i); try { listView1.Items[i].Remove(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Fehler!"); } } }
-
Du machst es Dir sowieso ganz schön umständlich. Das geht wesentlich einfacher:
List<ListViewItem> selected = new List<ListViewItem>(); foreach (ListViewItem item in listView1.CheckedItems) selected.Add(item); foreach (ListViewItem item in selected) listView1.Items.Remove(item);
Wenn Du schon C# 3 benutzt, geht es sogar nochmal wesentlich einfacher:
var selected = new List<ListViewItem>(listView1.CheckedItems.Cast<ListViewItem>()); selected.ForEach(item => listView1.Items.Remove(item));
-
Das Problem ist, daß nach dem Löschen eines Elements der Schleifenzähler nicht erhöht werden sollte (denn dadurch würde das nachfolgende Element übersprungen, da es nach dem Löschen des Elements auf dessen Platz rutscht).
Du solltest aber richtigerweise die Liste rückwärts durchlaufen...
und die korrekte Abbruchbedingung wählen, nämlich ListView.CheckedItems.Count (denn sonst paßt deine Indexvariable nicht zur Abbruchbedingung)!!!
-
Hey!
Vielen Dank für eure Hilfe. Jetzt habe ich verstanden, was falsch ist und wie ich es besser machen kann.
Danke schön. Ciao!