Zuordnung von ListViewItems zu List<>Items
-
Hi Leute!
Folgendes Problem: Ich habe beliebig viele Objekte (die in einer List<> gespeichert sind), die jeweils einen Termin darstellen. Diese Objekte stelle ich jetzt in einem ListView-Element dar. Der User kann dann einzelne Termine markieren (
listview.CheckBoxes = true;
), um diese dann bspw. zu löschen.
Aber wie bekomme ich es hin, dass ich die markierten ListViewItems aus der List löschen kann?
Aber wie kann ich herausfinden welches List<>-Element ich löschen muss? Ich müsste den Index des markierten ListViewItems rausbekommen und dann das Element mit dem selben Index aus der List<> löschen. Ändert sich der Index wenn die ListView irgendwie anders sortiert wird?dangge schöön! Wenn es schwer zu verstehen ist, dann erkläre ich es gerne nochmal. Allerdings finde ich schon die Formulierung des Problems sehr schwer. Wie soll ich dann das Problem lösen
-
Mittels ListView.CheckedItems bzw. ListView.CheckedIndices erhälst du erstmal eine Liste aller markierten ("gecheckten") Einträge.
Nun mußt du halt irgendwie deine List<> damit abgleichen:
- Index
- Id
- Name
- ...
-
Ändert sich der Index wenn die ListView irgendwie anders sortiert wird?
Ja, das mußt du selber synchronisieren (die Indizes der einer sortierten Liste ändern sich).
Ähnliches Problem s.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-208139.html
-
Hoi!
Und wie funktioniert so ein Abgleich? Daran bin ich bis jetzt gescheitert... Wäre cool wenn ihr mir dazu einen Tip geben könnt.
Danke!
-
Du mußt halt das Objekt entsprechend eines der oben erwähnten Kriterien in der anderen Liste suchen.
// MyItem ist dann der entsprechende Datentyp // Die Liste mit den Einträgen List<MyItem> MyList; // Suche Eintrag int FindItem(MyItem item) { for(int i=0; i<MyList.Count; i++) { if(item.Id == MyList[i].Id) // oder Name oder sonstwas ... return i; // item found: return index } return -1; // item not found } // Aufruf foreach(MyItem item in ListView.CheckedItems) { int nIdx = FindItem(item); if(nIdx >= 0) // if found in list { MyItem item = MyList[nIdx]; // do something with item // example: MyList.RemoveAt(nIdx); // delete item at position 'nIdx' } }
Schau dir am besten mal die Beispiele in der MSDN zu List<> bzw. den Eigenschaften davon an.
-
Du könntest auch die Items in die Tags deiner ListViewItems packen und dann mit Remove aus der Liste entfernen.
List<MyItem> MyList; void RemoveCheckedItems() { foreach(ListViewItem item in MyListView.CheckedItems) { MyList.Remove((MyItem)item.Tag); MyListView.Item.Remove(item); } } void AddItem(MyItem item) { MyListView.Items.Add(item.Name).Tag = item; }