bigpoint Geschrieben 10. Dezember 2002 Geschrieben 10. Dezember 2002 Da bin ich noch mal ;-) Wie kann ich auf Benutzer Ereignisse reagieren beim CListCtrl dh. wenn er im CListCtrl klickt die Daten aus dem Feld auslesen Vielen Dank Zitieren
Klotzkopp Geschrieben 10. Dezember 2002 Geschrieben 10. Dezember 2002 Du erstellst eine Nachrichtenbehandlungsfunktion für LVN_ITEMCHANGED. Die sollte dann in etwa so aussehen: [color=blue]void CDeinDialog[/color]::OnItemchangedList([color=blue]NMHDR[/color]* pNMHDR, [color=blue]LRESULT[/color]* pResult) { [color=purple]NM_LISTVIEW[/color]* pNMListView = ([color=purple]NM_LISTVIEW[/color]*)pNMHDR; if( pNMListView->uNewState & [color=purple]LVIS_SELECTED[/color] ) { [color=green]// In pNMListView->iItem steht der Index des gewählten Items[/color] } *pResult = 0; }[/CODE] Zitieren
bigpoint Geschrieben 10. Dezember 2002 Autor Geschrieben 10. Dezember 2002 Sorry für die blöde Frage aber wie komme ich dann auf die Daten die in der Spalte stehen ? Zitieren
Klotzkopp Geschrieben 10. Dezember 2002 Geschrieben 10. Dezember 2002 CListCtrl::GetItemText Zitieren
bigpoint Geschrieben 10. Dezember 2002 Autor Geschrieben 10. Dezember 2002 Originally posted by Klotzkopp CListCtrl::GetItemText Irgend wie checke ich es heute nicht mehr in MSDN steht CListCtrl::GetItemText int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const; CString GetItemText( int nItem, int nSubItem ) const; Return Value The version returning int returns the length of the retrieved string. The version returning a CString returns the item text. Parameters nItem The index of the item whose text is to be retrieved. nSubItem Specifies the subitem whose text is to be retrieved. lpszText Pointer to a string that is to receive the item text. nLen Length of the buffer pointed to by lpszText. Trozdem kriege ich den Inhalt nicht oder übrigens was braucht die Methode pNMListView->iItem es ist irgend wie von java++ oder Zitieren
Klotzkopp Geschrieben 10. Dezember 2002 Geschrieben 10. Dezember 2002 Originally posted by 007ski Irgend wie checke ich es heute nicht mehr in MSDN steht CListCtrl::GetItemText int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const; CString GetItemText( int nItem, int nSubItem ) const;Es gibt zwei Versionen dieser Methode. Die erste Version schreibt den Text in einen Puffer: // hole Text von Item 3, SubItem 5 char szBuffer[200]; m_listctrl.GetItemText( 3, 5, szBuffer, 199 ); Die zweite Version macht es noch einfacher, sie liest den Text in ein CString-Objekt und gibt dieses zurück: // hole Text von Item 3, Subitem 5 CString strText = m_listctrl.GetItemText( 3, 5 ); übrigens was braucht die Methode pNMListView->iItem es ist irgend wie von java++ oder Das ist keine Methode, sondern ein int. In diesem int steht der Index des selektierten Items. Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 Also wenn ich so schreibe: int item = pNMListView->iItem; // hole Text von Item 3, Subitem 5 CString strText = m_Grid.GetItemText( item, 5 ) kriege ich ihn strText nur die Daten die in der spalte 5 stehen ich brauche aber alle Gibt da irgend eine Möglichkeit Zitieren
Klotzkopp Geschrieben 11. Dezember 2002 Geschrieben 11. Dezember 2002 Originally posted by 007ski ...kriege ich ihn strText nur die Daten die in der spalte 5 stehen ich brauche aber alle Gibt da irgend eine Möglichkeit Wo ist denn das Problem? :confused: CString strText0 = m_Grid.GetItemText( item, 0 ); CString strText1 = m_Grid.GetItemText( item, 1 ); CString strText2 = m_Grid.GetItemText( item, 2 ); CString strText3 = m_Grid.GetItemText( item, 3 ); CString strText4 = m_Grid.GetItemText( item, 4 ); CString strText5 = m_Grid.GetItemText( item, 5 ); ... Oder so: CString strGanzeZeile; for( int i=0; i<nColumnCount; ++i ) { strGanzeZeile += m_Grid.GetItemText( item, i ); }[/CODE] Oder lies die Texte in ein Array von CStrings... Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 Kein Problem ich habe nur gedacht es gibt irgendeine Methode von MFC die das einfach für mich erledigt ;-))) Noch eine Frage: ich habe am Anfang mit NM_CLICK statt LVM_ITACHMEND benutz wo ist der Unterschied und was ist besser ? Vielen Dank für dein :mod: Klozkop Zitieren
Klotzkopp Geschrieben 11. Dezember 2002 Geschrieben 11. Dezember 2002 NM_CLICK wird nur mit der Maus ausgelöst. Außerdem ist es dabei möglich, über LVM_SUBITEMHITTEST herauszufinden, ob auf ein Subitem geklickt wurde. LVN_ITEMCHANGED wird immer ausgelöst, wenn ein Item selektiert oder deselektiert wird, egal ob das durch die Maus oder die Tastatur ausgelöst wurde. Wenn Dein List Control auch mit der Tastatur bedienbar sein soll, musst Du LVN_ITEMCHANGED verwenden. Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 Originally posted by Klotzkopp NM_CLICK wird nur mit der Maus ausgelöst. Außerdem ist es dabei möglich, über LVM_SUBITEMHITTEST herauszufinden, ob auf ein Subitem geklickt wurde. LVN_ITEMCHANGED wird immer ausgelöst, wenn ein Item selektiert oder deselektiert wird, egal ob das durch die Maus oder die Tastatur ausgelöst wurde. Wenn Dein List Control auch mit der Tastatur bedienbar sein soll, musst Du LVN_ITEMCHANGED verwenden. :uli Vielen Dank Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 Nach was jetzt versuche ich es so machen das bei starten des Programms der erste Satz in ClistCtr angezeigt wird dann mache ich so: m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED); und zwar das habe ich schon sowohl in der Methode OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult) als in OnInitialUpdate() machen. Der Effekt ist so das erst beim einklicken wird der erste Satz aktiv und somit ist er auch immer aktiv dh. wenn ich andere Felder klicke bleibt er aktiv Zitieren
Klotzkopp Geschrieben 11. Dezember 2002 Geschrieben 11. Dezember 2002 Originally posted by 007ski m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED);Damit löschst Du explizit den Focus-State, falls das Item ihn hat. Macht nicht viel Sinn, also besser so: m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); und zwar das habe ich schon sowohl in der Methode OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult)Das verursacht den beschriebenen Effekt: man kann kein anderes Item auswählen. Hier darfst Du das auf keinen Fall machen. als in OnInitialUpdate() machen.Das kommt schon eher hin. Sind da die Items denn schon eingetragen? Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 also in OnInitialUpdate() sind keine Items eingetragen trotzdem wenn ich es da versuche abzurufen funk nicht brauche ich vieleich Update oder so ? Zitieren
Klotzkopp Geschrieben 11. Dezember 2002 Geschrieben 11. Dezember 2002 Wie sollte das auch funktionieren? Du versuchst, das erste Item in einem List Control zu selektieren, das keine Items enthält. Du musst diese Zeile ausführen, nachdem Du das List Control mit Daten gefüllt hast. Zitieren
bigpoint Geschrieben 11. Dezember 2002 Autor Geschrieben 11. Dezember 2002 Originally posted by Klotzkopp Wie sollte das auch funktionieren? Du versuchst, das erste Item in einem List Control zu selektieren, das keine Items enthält. Du musst diese Zeile ausführen, nachdem Du das List Control mit Daten gefüllt hast. Mache ich auch, also ich habe mich falsch ausgedruckt es ist so ich habe eine Methode in die ich das List Control mit Daten fühle sieht so aus: void lalaView::LoadCListCtrl() { //Zeiger auf die Datensatzklasse CCustomRs* pRs; // Zeiger auf Dokumentobjekt holen pRs = GetDocument()->GetRecSet(); //Columns in CListCtrl Deklarieren m_Grid.InsertColumn(0, "BenutzerID", LVCFMT_LEFT, 120); m_Grid.InsertColumn(1, "Loginname", LVCFMT_CENTER, 80); m_Grid.InsertColumn(2, "Vorname", LVCFMT_LEFT, 120); m_Grid.InsertColumn(3, "Nachname", LVCFMT_LEFT, 100); m_Grid.InsertColumn(4, "Standort", LVCFMT_RIGHT, 80); m_Grid.InsertColumn(5, "Telefon", LVCFMT_CENTER, 100); m_Grid.SetExtendedStyle(m_Grid.GetExtendedStyle() | LVS_EX_FULLROWSELECT); //CListCtrl mit Daten fühlen while(!GetDocument()->m_pRs->EndOfFile){ // Umwandlung int in CString strBenutzerID.Format( "%i", pRs->m_BenutzerID ); strStatus.Format( "%i", pRs->m_Status); strErstelldatum.Format("%d", pRs->m_dtErstelldatum); strLetzteAend.Format("%d",pRs->m_dtLetzteAend); strLetzterLogin.Format("%d",pRs->m_dtLetzterLogin); strPWGueltigBis.Format("%d",pRs->m_dtPWGueltigBis); int nItem = m_Grid.InsertItem(0, strBenutzerID); m_Grid.SetItemText(nItem, 1, m_strLoginname); m_Grid.SetItemText(nItem, 2, m_strFirstName); m_Grid.SetItemText(nItem, 3, m_strLastName); m_Grid.SetItemText(nItem, 4, m_strStandort); m_Grid.SetItemText(nItem, 5, m_strPhone); GetDocument()->m_pRs->MoveNext(); RefreshBoundData(); } ModifyStyle(NULL, LVS_REPORT, 0); m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); } und in OnInitialUpdate abrufe sollte funktionieren oder ?? Leider ist es nicht der Fall ;-((( Da aber noch eine Frage zu while schleife die fühlt zwar das List Control mit Daten aber die BenutzerID ist Abwärts sortiert dh stat 12345 54321 ich vermute es liegt an int nItem = m_Grid.InsertItem(0, strBenutzerID); bin mir aber nicht sicher Zitieren
Klotzkopp Geschrieben 13. Dezember 2002 Geschrieben 13. Dezember 2002 Hat das List Control den Fokus oder den Style LVS_SHOWSELALWAYS? Wenn beides nicht der Fall ist, kannst Du die Selektion gar nicht sehen. Zitieren
bigpoint Geschrieben 13. Dezember 2002 Autor Geschrieben 13. Dezember 2002 Originally posted by Klotzkopp Hat das List Control den Fokus oder den Style LVS_SHOWSELALWAYS? Wenn beides nicht der Fall ist, kannst Du die Selektion gar nicht sehen. Merci Zitieren
bigpoint Geschrieben 15. Dezember 2002 Autor Geschrieben 15. Dezember 2002 Noch zwei Probleme: 1 in meinem Programm habe ich auch Möglichkeit das der Benutzer durch ein Toolbar zum ersten letzten usw. Datensatz in Control List geht und der als aktiv markiert wird. Es funk ( fast ) nur die Spalte die ich beim Programmstart oder durch anklicken aktiv mache bleibt auch angezeigt also blau ;-( so mache ich es: void lalaView::OnBenutzerFirst() { GetDocument()->MoveFirst(); // List Control Spalte aktiviren m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); UpdateData(FALSE); } also wenn ich mein progi starte dann welle ich irgend eine spalte dann will durch Toolbar zu erste wider zurück und das Resultat es werden beide Spalten angezeigt also erste und die die ich angeklickt habe sollte nur erste ;-(( 2 ich habe auch eine Funktion Löschen die löscht den Datensatz in DB funk auch super plus nur den Datensatz wird weiter in List Control angezeigt also in DB ist gelöscht in List Control sichtbar ;-( habe es so versucht zu lösen m_Grid.UpdateData(FALSE); Zitieren
Klotzkopp Geschrieben 15. Dezember 2002 Geschrieben 15. Dezember 2002 Bevor Du die neue Selektion auf den ersten Eintrag setzt, musst Du zuerst die alte Selektion entfernen:POSITION pos = m_Grid.GetFirstSelectedItemPosition(); if( pos ) { m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), LVIS_SELECTED, 0 ); }[/CODE] UpdateData bewirkt nur bei Wert/Value-Variablen den Datenaustasch zwischen Variable und Steuerelement. Bei Steuerelement/Control-Variablen wie CListCtrl macht UpdateData gar nichts. Den gelöschten Datensatz musst Du von Hand mit CListCtrl::DeleteItem aus dem List Control enfernen. Zitieren
bigpoint Geschrieben 16. Dezember 2002 Autor Geschrieben 16. Dezember 2002 m_Grid.DeleteItem(nItem); funktioniert wunderbar void lalarView::OnBenutzerFirst() { // Zum ersten Datensatz gehen GetDocument()->MoveFirst(); POSITION pos = m_Grid.GetFirstSelectedItemPosition(); if( pos ) { m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), LVIS_SELECTED, 0 ); } } so wie ich es verstehe ist es so dass Du holst sich Item der zuerst selektiert wahr also 0 im meinem fall und dann setz Du ihn (Item) zurück ? Leider funk nicht Bevor Du die neue Selektion auf den ersten Eintrag setzt, musst Du zuerst die alte Selektion entfernen“/B] ja schon klar aber ich weis es nicht wie ?? Zitieren
FighterFigger Geschrieben 16. Dezember 2002 Geschrieben 16. Dezember 2002 reicht denn der Schalter LVS_SINGLESEL nicht? (Dialog-Editor: "Einzelauswahl") Dann sollte doch nur einer markiert sein. ansonsten müßte es was wie: myList.SetItemState(index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); doch auch als: myList.SetItemState(index, 0 | 0, LVIS_SELECTED | LVIS_FOCUSED); geben ... oder sowas ähnliches Zitieren
Klotzkopp Geschrieben 16. Dezember 2002 Geschrieben 16. Dezember 2002 FighterFigger hat Recht, es muss lauten: m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), 0, LVIS_SELECTED ); Zitieren
bigpoint Geschrieben 16. Dezember 2002 Autor Geschrieben 16. Dezember 2002 Ich glaube ich werde verrückt void lalaView::OnBenutzerLast() { // Zum letztem Datensatz gehen GetDocument()->MoveLast(); POSITION pos = m_Grid.GetFirstSelectedItemPosition(); int itemanzahl = m_Grid.GetItemCount(); if( pos ) { m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), itemanzahl, LVIS_SELECTED ); } // List Control Spalte aktiviren m_Grid.SetItemState(itemanzahl,LVIS_SELECTED,LVIS_SELECTED); } so versuche ich den Letzten Datensatz zu markieren leider ohne Erfolg Zitieren
Klotzkopp Geschrieben 16. Dezember 2002 Geschrieben 16. Dezember 2002 Der erste Parameter von SetItemState ist der Index des Items. Die anderen beiden regeln, was mit dem Item passiert. Der zweite ist der Wert, der dritte eine Bitmaske. Wenn Du also ein Item selektieren willst, schreibst Du: m_ctrl.SetItemState( nItem, LVIS_SELECTED, LVIS_SELECTED ); Wenn Du die Selektion eines Items entfernen willst: m_ctrl.SetItemState( nItem, 0, LVIS_SELECTED ); Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.