CListCtrl fuellen (again)



  • Hallo,

    ich bin noch nicht wirklich weiter gekommen mit meinem Problem.
    Also nochmals von Anfang an:
    Ich erstelle eine SDI-Anwendung. Mit dieser greife ich auf eine Datenbank zu. Soweit so gut. Ich kann mich auch zwischen meinen Datensaetzen hin und her bewegen. Das problem an der Sache ist, dass ich mir die Datensaetze nur einzeln (in einem Edit-Feld) anschauen kann. Ich moechte aber, dass mir alle Datensaetze aufgelistet werden (in Tabellenform). Dazu benutze ich ein ListCtrl-Element (report). Nach vielen Lesen und probieren, kann ich ein CListCtrl-Element in einer Dialog-Anwendung "per Hand" fuellen. Ausserdem hab ich gelernt, wie ich Daten aus einem Editfield in ein CListCtrl uebernehmen kann (wiederum dialog Anwendung). Ich bekomme es aber nicht gebacken, das ClistCrtl mit den Daten meiner Datenbank zu fuellen. Gibt es denn da nirgends eine Step-for-Step Anleitung? Ich bin hier schon am verzweifeln.

    Tschau Arndtinho



  • Wozu überhaupt ein Edit Feld ???

    Ich habe doch erst vor ein paar Wochen hier den kompletten code gepostet !!!

    Also nochmal von vorn:

    Du hast doch eine ..Set Klasse von deinem Tabelle, wenn nicht erstell eine (Abgeleitet von CRecordSet).

    ..Set db;
    CString sql;
            sql = "select * from DeineTabelle where ...... ='";
    try 
        {
            db.Open(CRecordset::snapshot, sql);
    
            if(db.IsEOF())                  // Wenn kein Datensatz gefunden wird 
            {
                AfxMessageBox("Konnte keine gültigen Datensatz in Tabelle finden", MB_ICONEXCLAMATION);
                return;
            }
            else
                {
                               db.MoveFirst();
                                  do
                    {
    
                        int nr = m_liste.InsertItem(1, db.m_DATENSATZ); 
                        m_liste.SetItemText(nr, 1, db.m_...);
                        m_liste.SetItemText(nr, 2, db.m_..);
                        m_liste.SetItemText(nr, 3, db.m_..);
    
                        db.MoveNext();
                    }
                             while(!db.IsEOF());
                }
            db.Close();
    
        }
        catch(CDBException* e)
        {
            AfxMessageBox( e->m_strError, MB_ICONEXCLAMATION );
            return;
        }
    


  • Hi,

    ich weis, sorry.
    Also meine Set-Klasse sieht so aus:

    class CDB_0Set : public CRecordset
    {
    public:
    CDB_0Set(CDatabase* pDatabase = NULL);
    DECLARE_DYNAMIC(CDB_0Set)

    // Field/Param Data
    //{{AFX_FIELD(CDB_0Set, CRecordset)
    long m_ID;
    CString m_Name;
    CString m_Vorname;
    //}}AFX_FIELD

    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CDB_0Set)
    public:
    virtual CString GetDefaultConnect(); // Default connection string
    virtual CString GetDefaultSQL(); // default SQL for Recordset
    virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
    //}}AFX_VIRTUAL

    // Implementation
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif

    }

    Dann habe ich noch in meiner CDB_0View-Class ein CListCtrl-Steuerelement.

    Ich komme jetzt aber nicht ganz mit, wo ich den Code, den Du mir gepostet, hast eintragen muss.
    ICh bin Dir aber fuer Deine Hilfe dankbar.

    Tschau Arndtinho



  • Ich habe jetzt ein wenig rumprobiert und den Code von Dir in meine Set-Klasse geschrieben. Nachdem ich alle Fehler beseitigt habe und das Programm starten will kommt ein Fehler. Ich klicke also auf den Debug-Button und da bringt erscheint folgende Meldung:

    "nhandled exception in test_0.exe (MFC42D.DLL): 0xC00000FD: Stack Overflow"

    Ich weis ja, das da irgendwas ueberladen ist, aber was?

    Tschau Arndtinho



  • Okk !!

    der Code gehört natürlich nicht in die Set Klasse, die sind nur für die Tabellen deiner DB da !!

    Wenn du eine DialogAnwendung hast, dann in die Dlg- Klasse, wenn SDI, dann in die View, halt da wo du auf die DB zugreifen willst !! (In diesem Fall die CDB_0View Klasse)

    Gruß



  • Hi,

    ok, hab ich gemacht (blablaView.cpp). sieht jetzt so aus:

    CBlablaView::CBlablaView()
    : CRecordView(CBlablaView::IDD)
    {
    //{{AFX_DATA_INIT(CBlablaView)
    // NOTE: the ClassWizard will add member initialization here
    m_pSet = NULL;
    //}}AFX_DATA_INIT
    // TODO: add construction code here

    CBlablaSet db;
    CString sql;
    sql = "select * from names";
    try
    {
    db.Open(CRecordset::snapshot, sql);

    if(db.IsEOF()) // Wenn kein Datensatz gefunden wird
    {
    AfxMessageBox("Konnte keine gültigen Datensatz in Tabelle finden", MB_ICONEXCLAMATION);
    return;
    }
    else
    {
    db.MoveFirst();
    do
    {

    int nr = m_Liste.InsertItem(1, db.m_Name);
    m_Liste.SetItemText(nr, 1, db.m_Name);
    m_Liste.SetItemText(nr, 2, db.m_Vorname);

    db.MoveNext();
    }
    while(!db.IsEOF());
    }
    db.Close();

    }
    catch(CDBException* e)
    {
    AfxMessageBox( e->m_strError, MB_ICONEXCLAMATION );
    return;
    }

    }

    Beim Kompilieren kommt keine Fehlermeldung. Auch wenn die Datenbank leer ist funktioniert es. Aber sobald ich Werte in die datenbank eintrage funktioniert es nicht mehr.

    Tschau Arndtinho



  • Autsch !!!

    Sorry, aber da gehört es auch nicht hin, das ist der Konstrucktor.
    Es gibt doch einen bestimmten Punkt zur Laufzeit, wo du die Daten reinholst, Button, Timer etc. in solche Methoden kannst du es auch reinschmeißen.

    Wenn du es Beim Programmstart haben willst, benutze die OnInitialUpdate Methode

    int nr = m_Liste.InsertItem(1, db.m_Name);
    m_Liste.SetItemText(nr, 1, db.m_Name);

    Wieso füllst du zwei Felder mit einem und dem selben Datensatz ???

    Ach ja, folgenden Code brauchst auch für den ListCtrl:

    m_Liste.SetExtendedStyle(m_Liste.GetExtendedStyle() | LVS_EX_FULLROWSELECT +1);
        m_Liste.InsertColumn(0,  "Name",        LVCFMT_LEFT,  60);
    

    Für CListCtrl -> MSDN, oder die Suchfunktion



  • langsam verliere ich den ueberblick (wenn ich ihn jemals bessesen habe).
    hast du nicht irgendwo eine beispielanwendung, die du mir schicken koenntest (als anschauungsobjekt)?
    mit php ist das irgendwie alles viel einfacher 🤡

    Arndtinho@gmx.net

    Arndtinho


Anmelden zum Antworten