ListControl und Datenbank



  • Hallo,
    Ich habe eine Liste und auf der Liste habe ich Paar namen .Die Liste ist in Datenbank gespeichert und wurde an einer Listcontrol/ListenElement(Steuerelement) wie unten angezeigt.

    12 Frank Müller
    53 Martin Müller
    81 Heiko Zimmermann
    59 Werner Güntner

    ich möchte z.B. Martin Müller in der Liste auswählen und aus dem Datenbank entfernen.
    Kann mir jemand vielleicht helfen

    Gruß



  • Für das Arbeiten mit dem ListControl kann ich dir das hier empfehlen:
    http://www.codeproject.com/KB/list/listctrldemo.aspx

    Ich würde den Ext-Style LVS_EX_FULLROWSELECT setzen, damit kannst du eine ganze Zeile markieren. Ich hab das in die Behandlungsroutine für das Doppelklickereignis gesetzt. Dann muss du nur noch die selektiere Teil ermitteln, in der Datenbank danach suchen und dann löschen.



  • void TestDialog::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    	*pResult = 0;
    }
    

    funktion sieht so aus.. Wo muss ich die LVS_EX_FULLROWSELECT setzen und wie ermittle ich die selektiere Teil???



  • void TestDialog::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    	*pResult = 0;
    
    	RSooo rsAdmin(m_pDoc->m_pDatabase);//DB Connection
    	rsAdmin.Open(CRecordset::dynaset, NULL, CRecordset::none);
    	int nInsPos	=m_bzksLst.GetItemCount();
    	rsAdmin.Delete();
    
    //	m_bzksLst.GetItem(nInsPos);
    	m_bzksLst.DeleteItem(nInsPos);
    }
    

    z.B. Wie Oben???
    Das tut aber nicht was ich will..



  • Den Ex-Style musst du bei der Erzeugung des ListCtrls setzen (also z.B. in der OnInitDialog falls du es in einem Dialogfeld benutzt).

    void TestDialog::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        *pResult = 0;
    
    //falls Mehrfachselection aktiviert ist
    POSITION pos = m_bzksLst.GetFirstSelectedItemPosition( );
    	int nItem = 0;
    	int nCount = 0;
    
    	while ( pos != NULL )
    	{
    		nItem = m_bzksLst.GetNextSelectedItem( pos );
    		nCount=m_bzksLst.GetItemCount();
    	}
    
        RSooo rsAdmin(m_pDoc->m_pDatabase);//DB Connection
        rsAdmin.Open(CRecordset::dynaset, NULL, CRecordset::none);
    //hier musst du erst mal die entsprechende Satzgruppe anspringen (Stichwort MoveFirst/MoveNext....
        rsAdmin.Delete();
    
    //    m_bzksLst.GetItem(nInsPos);
        m_bzksLst.DeleteItem(nInsPos);
    }
    


  • Das LVS_EX_FULLROWSELECT mußt du bei der Initialisierung deines Views/Dialoges Setzen

    m_bzksLst.SetExtendedStyle ( LVS_EX_FULLROWSELECT );
    

    und das Löschen sollte so laufen

    void TestDialog::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult)
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        *pResult = 0;
    
        RSooo rsAdmin(m_pDoc->m_pDatabase);//DB Connection
        rsAdmin.m_strFilter.Format(_T("ID = %s),m_bzksLst.GetSelectionMark( ));
        rsAdmin.Open(CRecordset::snapshot, NULL, CRecordset::none);
        rsAdmin.Delete();
        rsAdmin.Update();
        m_bzksLst.DeleteItem(m_bzksLst.GetSelectionMark( ));
    }
    

    So in der Art(also aus dem Kopf) sollte das gehen



  • @CTecS: naja, aber du musst doch erst mal den zu löschenden Datensatz anspringen. Ich habe das so wie hier gemacht:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-164310.html

    Allerdings kracht er mir bei dem Update nach dem Delete an die Wand. Ich habs weggelassen und da funzt es auch.



  • reicht dir die zeile

    rsAdmin.m_strFilter.Format(_T("ID = %d"),m_bzksLst.GetSelectionMark( ));
    

    zum filtern nicht? da ich ja deinen Tabellenaufbau nicht kenne, hab ich halt mal etwas geraten, der Sinn dieser Zeile war aber glaube ich zu erkennen. Warum der bei dir beim Update an die Wand klatscht wirste nur sehn wenn du mal mit dem Debuger durchgehst, vielleicht ist gar kein Datensatz ausgewählt worden.

    Desweiteren kannst du ja auch ganz einfach ein SQL-Statement über CDatabase::ExecuteSQL absetzen. ohne erst mit CRecordset die Daten laden zu müssen.



  • CTecS schrieb:

    reicht dir die zeile

    rsAdmin.m_strFilter.Format(_T("ID = %d"),m_bzksLst.GetSelectionMark( ));
    

    zum filtern nicht?

    sorry, das hatte ich komplett überlesen. hast recht, damit sollte die selektierung klappen

    CTecS schrieb:

    da ich ja deinen Tabellenaufbau nicht kenne, hab ich halt mal etwas geraten, der Sinn dieser Zeile war aber glaube ich zu erkennen.

    ja, ich selektiere zwar nach der primärschlüsselspalte, die ist aber in den seltensten fällen die id. weiterhin stellt mein listctrl in der ersten spalte eine fortlaufende nummerierung dar, die dann nicht mit der id konform ist, sofern datensätze gelöscht worden sind. damit hab ich erst mal keinen direkten zugriff auf die id des entsprechenden datensatzes.

    CTecS schrieb:

    Warum der bei dir beim Update an die Wand klatscht wirste nur sehn wenn du mal mit dem Debuger durchgehst, vielleicht ist gar kein Datensatz ausgewählt worden.

    Desweiteren kannst du ja auch ganz einfach ein SQL-Statement über CDatabase::ExecuteSQL absetzen. ohne erst mit CRecordset die Daten laden zu müssen.

    Der klatscht deshalb an die Wand, weil er meint, dass der Datensatz nicht mehr da ist. Ich hab mir das so erklärt, dass er ja auch nicht mehr da sein kann, da ich ihn vorher gelöscht habe. in der datenbank selbst ist er schon nach dem delete weg (ich hab übrigens debugt).



  • Vielen Dank


Anmelden zum Antworten