Welche Funktion in einem CListCtrl



  • Hallo Leute,

    ich bin gerade am suchen einer geeigneten Funktion für die Bearbeitung meines CListCtrl.

    Ich habe aus Code Projekt eine Projekt mit einfließen lassen, was recht gut funktioniert.

    Jetzt kann ich in meiner Tabelle Daten eingeben.

    So jetzt möchte ich ohne speichern Button arbeiten, und die Funktion soll mir sofort die Daten in meine Datenbank ablegen sobald der USer return, spalte gewechselt, ..... das ist das Problem, ich weis nicht auf was ich reagieren soll.

    Hat jemand eine Idee ??

    Gruß
    und Danke
    andy_mann



  • Hast du es schon mit WM_KEYDOWN versucht? Dann musst du blos gucken, welche Taste das war.

    Bzw. Es passiert doch bestimmt schon was beim Drücken von Enter oder einem Spaltenwechsel - wo ist der Code?



  • Hallo,

    er reagiert auf alle möglichen Funktionen, ich weis nicht welche ich am besten nehmen soll, ich versuche es zur zeit mit

    LVN_ITEMCHANGED
    

    weis aber nicht ob ich da bald in eine sackgasee komme..

    Gruß
    andy_mann



  • Zeig doch mal die Messagemap, dann sehe ich vielleicht was. 🙂
    Ich kann sowas immer nur beim draufgucken finden - blind klappt noch nicht. 😉



  • Hallo,

    soweit bin ich:

    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_VARIABLE_BENUTZER, OnLvnItemchangedListVariableBenutzer)
    
    void CAdminSeite1::OnLvnItemchangedListVariableBenutzer(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    
    	POSITION pos = m_ListVariablen.GetFirstSelectedItemPosition();
    	int nItem = m_ListVariablen.GetNextSelectedItem(pos); 
    
    	CString m_variablenTyp = m_ListVariablen.GetItemText(nItem,0);
    	CString m_Wert = m_ListVariablen.GetItemText(nItem,1);
    
    	if(m_variablenTyp != "..." && m_variablenTyp != "" && m_Wert != "")
    	{
    
               MessageBox("Jetzt");
    
    	}
    
    	*pResult = 0;
    }
    

    Gruß
    andy_mann



  • Hab grade gesehen, dass ich mal wieder die Messagenamen verdreht hatte - ich meinte vorhin LVN_KEYDOWN. 🙂

    Ansonsten kenne ich leider dein Listcontrol zu schlecht um mehr zu wissen. 😞



  • HAllo,

    wie kann ich dann eigentlich bei drücken von z.b. return drauf reagieren ??
    Mann muß dieses Taste glaube ich erst in der Resource angeben, aber dann im Code ??

    Gruß
    andy_mann



  • Die Taste musst du nicht in der Resource angeben.

    Die VK_irgendwas kannst du auch so benutzen. VK_ENTER (oder VK_RETURN???) in deinem Fall.

    Hier ist ein Ausschnitt aus meiner einen keydownfunktion, da siehst du, wie man an die Taste kommt:

    void CArtikelView::OnKeydownLscArtikel(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	LV_KEYDOWN* pLVKeyDown = (LV_KEYDOWN*)pNMHDR;
    
    	// Index der markierten Zeile holen
    	int n = m_lscArtikel.GetSelectionMark();
    
    	// Ist überhaupt etwas ausgewählt?
    	if (n > -1)
    	{
    		// Index anpassen
    		if ((pLVKeyDown->wVKey == VK_UP) && (n > 0))
    		{
    			// Pfeil-rauf also einen Index runter
    			n--;
    		}
    //...
    


  • Vielen Dank,

    jetzt habe ich nur das Problem, dass er in diese Funktion garnicht springt ??

    Woran kann das liegen ??

    Gruß
    andy_mann



  • Hast du sie per Assistent eingebunden? Wie sieht deinen MessageMap aus? Wie sieht die vom Control selbst aus? (Vielleicht "verschluckt" es die Nachricht einfach.)



  • Such mal nach OnEndLabelEdit bzw. (On)BeginLabelEdit.

    Devil



  • Ja ich habe es über den asistemten gemacht,

    er findet keines der gesuchten verweise, nur OnEndLabelEdit , das ist aber in einer Funktion einer anderen Klasse.

    Gruß
    andy_mann





  • Zeig bitte mal deinen Messagemap - ohne kann ich dir nicht helfen, nur im Nebel stochern...



  • Hallo,

    .h
    public:
    ..
    .
    .
    afx_msg void OnLvnKeydownListVariableBenutzer(NMHDR *pNMHDR, LRESULT *pResult);
    
    .cpp
    BEGIN_MESSAGE_MAP(CAdminSeite1, CDialog)
    ..
    .
    .
    ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_VARIABLE_BENUTZER, OnLvnKeydownListVariableBenutzer)
    END_MESSAGE_MAP()
    

    Danke
    andy_mann



  • Und in der Listcontrol Klasse? (Wegen Verschlucken)



  • .h
    public:
    ..
    .
    CEditList m_ListVariablen; // ist von CListCtrl abgeleitet
    
    .cpp
    ..
    .
    DDX_Control(pDX, IDC_LIST_VARIABLE_BENUTZER, m_ListVariablen);
    

    Gruß
    andy_mann



  • Nein, ich meine in der Klasse CEditList. Die kann ja auch eine Messagemap haben...



  • Ups, oh ja....

    BEGIN_MESSAGE_MAP(CEditList, CListCtrl)
    	//{{AFX_MSG_MAP(CEditList)
    	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
    //	ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
    	ON_NOTIFY_REFLECT(LVN_KEYDOWN, OnKeydown)
    	ON_WM_CREATE()
    	//}}AFX_MSG_MAP
    	ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclk)
    END_MESSAGE_MAP()
    

    daran wird es wohl ligen....

    Aber was muß ich jetzt tun ??

    Gruß
    andy_mann



  • Ich hab leider keine Ahnung, was dieses ON_NOTIFY_REFLECT ist - aber wenn ich die MSDN richtig verstehe, dann ist es der Grund.

    If, in your parent window class, you supply a handler for a specific WM_NOTIFY message or a range of WM_NOTIFY messages, your handler will be called only if the child control sending those messages does not have a reflected message handler through ON_NOTIFY_REFLECT().

    Hat das Teil auch eine Funktion dazu? 😕
    Vielleicht kannst du da drin ja deine eigene Nachricht an pParent abschicken. Dann brauchst du nur noch reagieren. Also, wenn da was passendes ist, zeig doch mal... 🙂


Anmelden zum Antworten