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!


Anmelden zum Antworten