CListCtrl neu einlesen nach Löschaktion in DB



  • Hallo Forum,
    ich habe hier seit heute Mittag ein ziemlich bizarres Problem, dass ich nicht in den Griff kriege.
    Vielleicht weiss von euch ja jemand Rat.

    Aus einer Datenbank wird in ein CListCtrl der Inhalt in Spalten ausgelesen.

    Der User kann jetzt im Listenfeld ein item markieren und dann ueber Dialoge den ausgewaehlten Datensatz bearbeiten, sich Details ansehen oder einen neuen Datensatz ansehen.

    Klappt auch alles wunderbar. Was allerdings nicht funzt, ist die Aktualisierung des Listenfeldes nach dem Loeschen eines Datensatzes, obwohl ich hier genau so vorgehe, wie bei den anderen Dialogen. Erst wenn ich das Listenfeld zweimal aktualisiert habe(indem ich einen Datensatz einfuege, bearbeite oder einen anderen Datensatz loesche), bzw. das Prog neu aufrufe verschwindet mein geloeschter Datensatz auch im Listenfeld. In der Datenbank wurde er aber schon beim ersten Mal korrekt geloescht)

    So wird mein Listenfeld aktualisiert:

    void CProjektView::FillView()
    {
    
        m_MainList.DeleteAllItems();
        m_pSet->MoveFirst();
    
    // Temporaere Variable fuer die Aufnahme der id aus der Datenbank
        CString idtmp = "";
    
    // Die ausgewaehlten Spalten aus der Datenbank ins Listview laden
        while(!m_pSet->IsEOF())
        {
            // id der Datenbank in einen String umwandeln
            idtmp.Format("%i",m_pSet->m_id);
    
            //int nItem = m_MainList.InsertItem(0,idtmp);
            int nItem = m_MainList.GetItemCount();
            m_MainList.InsertItem(nItem,0,m_pSet->m_id);
            m_MainList.SetItemText(nItem,0,idtmp);
    
            // Abfragen, ob eine E-Mail Adresse vorhanden ist und nur
            // dann ein 'M' eintragen
            if(m_pSet->m_email.Find('@',0) != -1)
            {
                m_MainList.SetItemText(nItem,1, "M");
                m_MainList.SetItemText(nItem, 7, m_pSet->m_email);
            }else
            {
                m_MainList.SetItemText(nItem,1, m_pSet->m_email);
            }
    
            m_MainList.SetItemText(nItem, 2, m_pSet->m_name);
            m_MainList.SetItemText(nItem, 3, m_pSet->m_vorname);
            m_MainList.SetItemText(nItem, 4, m_pSet->m_telefon_privat);
            m_MainList.SetItemText(nItem, 5, m_pSet->m_fax);
            m_MainList.SetItemText(nItem, 6, m_pSet->m_telefon_mobil);
    
            m_pSet->MoveNext();
    
        };
            m_MainList.SetItemState(0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
            m_MainList.EnsureVisible(0,FALSE);
    
        // Funktion SetFlags() setzt die Flags fuer die Doc Klasse
            SetCurSel(0);
            SetFlags();
            m_Id = m_MainList.GetItemText(0,0);
    
            // Anzahl der gesamten Datensätze ausgeben
            CString str;
            str.Format("%i",m_MainList.GetItemCount());
            m_AnzahlMain = str;
            UpdateData(FALSE);
    }
    

    Hat irgendjemand Bock den Code mal anzugucken? Mir faellt naemlich nix mehr ein :o(

    Gruesse und Dank
    items



  • kann es sein das nicht in dieser funktion der fehler liegt?
    ich weiss es ja nicht aber musst du die daten nicht erst abspeichern und wieder neu einlesen? einfach aktualisieren ist doch schwachsinn oder? wenn das nicht der fall sein sollte entschuldige meine dumme antwort 😉



  • Hi linsnif,
    ich habe den Fehler schon an allen moeglichen Stellen gesucht, bin aber immer wieder hier haengen geblieben, weil die Daten ja durchaus in der Datenbank verschwinden (und zwar sofort beim Loeschen) und weil die Routine ja auch bei Add(), Edit() usw. funktioniert. Nur bei Delete() eben nicht.

    Trotzdem hier nochmal das Loeschen:

    void CProjektView::OnDsloeschen() 
    {
            CDsLoeschen *loeschen = new CDsLoeschen;
            loeschen->m_strFilter = "id = " + m_Id;
            loeschen->Open();
            loeschen->Delete();
            loeschen->Close();
            m_pSet->Requery();
            FillView();
    }
    

    Any more Ideas?

    Gruss und Dank
    items



  • das frist total Perfomance wie du das machst.

    Ich lösche eins. Alle Item werden gelöscht und Datenbank wird von vorne durchgegangen und Liste wird gefült.

    Ich würde das anders machen.
    User sagt löschen ich entferne Datensatz aus DB und ich entfernde das Listitem aus der Liste (aber nur das wo ich benötige).



  • Hilft vielleicht

    delete loeschen; ???
    


  • @RenéG guter tipp.

    sag mal ob es gefunkts hat



  • Hi,
    Astein. Werde ich mal probieren. Hatte ich gar nicht dran gedacht, dass es wahrscheinlich einfacher ist, das item in der Liste parallel zum delete in der Datenbank zu loeschen. Wundern tuts mich aber trotzdem das es nicht funzt.

    Gruesse und Dank
    items



  • Hi,
    Ich nochmal 🤡. Klappt auf diesem Wege natuerlich allerfeinst. Verstehe ich gar nicht, dass ich selber drauf gekommen bin. Ich habe mich da wirklich buckelig gefummelt, um den Fehler zu finden.

    Besten Dank nochmals
    sagt items


Log in to reply