CListCtrl - Markierte Zeilen löschen
-
Hallo,
ich lösche mit Entf markierte Zeilen aus einer ListCtrl. Wenn ich eine Zeile markiert habe klappt das auch wunderbar. Nur bei der Selektion mehrerer Zeilen werden nicht alle gelöscht. Je mehr markiert, je mehr bleiben übrig - aber ohne allgemeines Prinzip.
void CDMView::OnLvnKeydownHistorie(NMHDR *pNMHDR, LRESULT *pResult) { TRACE0("Keypress in Historie"); LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR); // wenn Entf gedrück wurde markierte Elemente löschen if (pLVKeyDow->wVKey == VK_DELETE) { TRACE0("Keypress in Historie: ENTF"); // Zeiger auf Historie (CListCtrl) holen CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_HISTORIE); // erstes selektiertes Element POSITION pos = pList->GetFirstSelectedItemPosition(); // solange noch selektierte Elemente while (pos) { // nächstes Element int nItem = pList->GetNextSelectedItem(pos); TRACE1("Item %d was selected!\n", nItem); // ermittle die Nummer für die Historie (Datenklasse) int nItemH = atoi(pList->GetItemText(nItem, 0)); // Lösche markiertes Zeile (CListCtrl) pList->DeleteItem(nItem); // lösche das Element aus der Historie (Datenklasse) GetDocument()->GetHistorie()->DeleteValue(nItemH); } } *pResult = 0; }
Wer kann mir helfen?
Gruß
Chris
-
So lösche ich die selektierten Items aus einer Liste
if(AfxMessageBox("Die gewählten Einträge löschen?",MB_YESNO)==IDYES) { CListCtrl l; CListCtrl * a; LVITEM lv; lv.mask =LVIF_STATE; lv.stateMask = LVIS_SELECTED; a = (CListCtrl *) l.FromHandle(active); while(a->GetSelectedCount() > 0) { for(int x = 0;x <=a->GetItemCount();x++) { lv.iItem = x; a->GetItem(&lv); if(lv.state == LVIS_SELECTED) { a->DeleteItem(x); } } } }
-
@Andorxor
Oje, ne ineinandergeschachtelte Schleife für ein simples lineares Problem?@MuehBln
Schon nicht schlecht, allerdings hast Du vergessen, dass du das Item an Position N löschst und danach aufgrund von GetNextSelectedItem mit N+2 weiteriterierst. Also wird Item N+1 einfach im Text übergangen.Also folgt:
// solange noch selektierte Elemente for( int nItem=0; nItem=pList->GetNextItem( nItem, LVNI_SELECTED)!=-1; ) { // nächstes Element TRACE1("Item %d was selected!\n", nItem); // ermittle die Nummer für die Historie (Datenklasse) int nItemH = atoi(pList->GetItemText(nItem, 0)); // Lösche markiertes Zeile (CListCtrl) pList->DeleteItem( nItem); // lösche das Element aus der Historie (Datenklasse) GetDocument()->GetHistorie()->DeleteValue(nItemH); }
-
Dankeschön!