Veröffentlicht 10. Dezember 200222 j 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
10. Dezember 200222 j 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]
10. Dezember 200222 j Autor Sorry für die blöde Frage aber wie komme ich dann auf die Daten die in der Spalte stehen ?
10. Dezember 200222 j Autor 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
10. Dezember 200222 j 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.
11. Dezember 200222 j Autor 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
11. Dezember 200222 j 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...
11. Dezember 200222 j Autor 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
11. Dezember 200222 j 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.
11. Dezember 200222 j Autor 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
11. Dezember 200222 j Autor 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
11. Dezember 200222 j 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?
11. Dezember 200222 j Autor also in OnInitialUpdate() sind keine Items eingetragen trotzdem wenn ich es da versuche abzurufen funk nicht brauche ich vieleich Update oder so ?
11. Dezember 200222 j 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.
11. Dezember 200222 j Autor 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
13. Dezember 200222 j Hat das List Control den Fokus oder den Style LVS_SHOWSELALWAYS? Wenn beides nicht der Fall ist, kannst Du die Selektion gar nicht sehen.
13. Dezember 200222 j Autor 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
15. Dezember 200222 j Autor 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);
15. Dezember 200222 j 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.
16. Dezember 200222 j Autor 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 ??
16. Dezember 200222 j 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
16. Dezember 200222 j FighterFigger hat Recht, es muss lauten: m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), 0, LVIS_SELECTED );
16. Dezember 200222 j Autor 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
16. Dezember 200222 j 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 );
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.