CListCtrl Zeilen markieren klappt nicht
-
Hallo,
also ich habe ein CListCtrl mit Report-Style im Dialogeditor auf einer CFormView erstellt und in der OnInitialUpdate() wird folgender Code zum einrichten der Tabelle ausgeführt:
int i = 0; m_lstCardTable.InsertColumn(i++, "Anz", LVCFMT_RIGHT, 30, -1); m_lstCardTable.InsertColumn(i++, "Bezeichnung", LVCFMT_LEFT, 120, -1); m_lstCardTable.InsertColumn(i++, "Sachnummer", LVCFMT_LEFT, 140, -1); m_lstCardTable.InsertColumn(i++, "P fix", LVCFMT_LEFT, 50, -1); m_lstCardTable.InsertColumn(i++, "P var", LVCFMT_LEFT, 50, -1); m_lstCardTable.InsertColumn(i++, "P ges", LVCFMT_LEFT, 50, -1); m_lstCardTable.SetExtendedStyle(LVS_EX_FULLROWSELECT);
Die Tabelle wird dann auf diese Weise gefüllt:
m_lstCardTable.InsertItem(m_lstCardTable.GetItemCount(), sAusgabe); m_lstCardTable.SetItemText(m_lstCardTable.GetItemCount()-1, 1, structONU->Shelf->Card->sName); m_lstCardTable.SetItemText(m_lstCardTable.GetItemCount()-1, 2, structONU->Shelf->Card->sSachNr); sAusgabe.Format("%.2f", structONU->Shelf->Card->fPowFix); m_lstCardTable.SetItemText(m_lstCardTable.GetItemCount()-1, 3, sAusgabe); sAusgabe.Format("%.2f", structONU->Shelf->Card->fPowVar); m_lstCardTable.SetItemText(m_lstCardTable.GetItemCount()-1, 4, sAusgabe);
Das klappt auch wunderbar, nur möchte ich, das z.b. der 2. Eintrag nach dem Füllen der Tabelle selektiert wird.
also hab ich das Forum durchstöbert, wie man das anstellen kann und bin auf fogendes gestossen:m_lstCardTable.SetItemState(1,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
Aber nichts passiert.
Muss danach oder davor noch irgendeine Funktion aufgerufen werden oder irgendeine Variable gesetzt sein?
-
Ich bin mir nicht sicher, aber ich würds mit UpdateData(false) versuchen und bei einer Combobox gibt es eine Funktion SetCurSel(int Index).
Vielleicht hilfts.
-
ela schrieb:
Ich bin mir nicht sicher, aber ich würds mit UpdateData(false) versuchen
Das hatte ich auch schon versucht, gebrachts hat es leider nichts
und bei einer Combobox gibt es eine Funktion SetCurSel(int Index).
Vielleicht hilftsSetCurSel gibt es in der CListCtrl nicht
-
Und SetSelection hat bei mir keinen Effekt. Ich such da nämlich auch eine Lösung.
-
Siehst du die Auswahl vielleicht nur nicht, weil das List Control nicht den Fokus hat? Dann hilft LVS_SHOWSELALWAYS.
-
Danke, das hilft.
Hatte eben auch mit SetFocus dem ListCtrl den Focus gegeben, und dann war es auf wundersame weise auch zu sehen
-
Hier is mein Versuch, kein keinen Effekt hat, ich kann die Zeilen schreiben oder nicht, fällt nicht auf.
m_lscOrte.SetFocus(); m_lscOrte.SetSelectionMark(m_lscOrte.GetItemCount()-1);
-
mhh irgendwie kann ich mich nicht einloggen, sonst würd ich jetzt auf Edit drücken
Da die Zeile auch markiert sein soll, wenn die List nicht im Focus ist, is deine Lösung echt genial.
-
estartu_de schrieb:
Hier is mein Versuch, kein keinen Effekt hat, ich kann die Zeilen schreiben oder nicht, fällt nicht auf.
m_lscOrte.SetFocus(); m_lscOrte.SetSelectionMark(m_lscOrte.GetItemCount()-1);
mit SetSelectionMark() scheint das bei sehr vielen nicht zu gehen (hatte auf der Suche nach ner Lösung für mein Prob eingige Beiträge deswegen gefunden)
mach es einfach mitm_lscOrte.SetItemState(m_lscOrte.GetItemCount()-1,LVIS_SELECTED|LVIS_FOCUSED|LVS_SHOWSELALWAYS,LVIS_SELECTED|LVIS_FOCUSED|LVS_SHOWSELALWAYS);
-
Danke, aber auch das geht nicht.
Ich hab schon aus purer Verzweiflung das hier da noch drunter geschrieben - auch keine Wirkung.
m_lscOrte.EnsureVisible(m_lscOrte.GetItemCount()-1, FALSE);
-
nun habe ich ein neues Problem.
und zwar habe ich neben meiner Liste 2 Buttons (back und next), mit denen ich die aktuell ausgewählte Zeile verändern kann. Nach dem Erstellen der Liste und einlesen der Daten wird automatisch die 1. Zeile markiert. Bei jeden SetFocus wird ein bestimmter Code ausgeführt, dies geschieht beim Erstellen, beim Fokussieren des 1. Eintrags und wenn ich auf next oder back drücke.
Jetzt aber mein Problem, wenn ich das 1. mal auf die 1. Zeile springe, erkennt er auch, das es die 1. Zeile ist. wenn ich auf next drücke, erkennt er das er jetzt in Zeile 2 ist etc... Aber wenn ich z.b. in der 2. Zeile auf back drücke, markiert er zwar die 1. Zeile, aber bei der Abfrage, welche Zeile markiert ist, bekomme ich NULL. Das gleich auch, wenn ich von der vorletzten Zeile in die letzte Zeile springe.
Hoffe ihr habt verstanden was ich meine, hier mal mein Quelltext://Wenn die Liste den Focus bekommt void CONUView::OnSetfocusList(NMHDR* pNMHDR, LRESULT* pResult) { if (POSITION pos = m_lstCardTable.GetFirstSelectedItemPosition()) { structONU->Shelf->Card = structONU->Shelf->Card_Start; while (m_lstCardTable.GetItemText((int)pos - 1, 1) != structONU->Shelf->Card->sName) structONU->Shelf->Card = structONU->Shelf->Card->next; m_TxtEditAnz = structONU->Shelf->Card->sName; } UpdateData(false); *pResult = 0; }
//wenn next gedrückt wird void CONUView::OnEditAnzBtnNext() { POSITION pos = m_lstCardTable.GetFirstSelectedItemPosition(); m_lstCardTable.SetItemState((int)pos - 1 , NULL , LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS); if (structONU->Shelf->Card->next->next == NULL) { m_BtnEditAnzBack.ShowWindow(SW_SHOW); m_BtnEditAnzNext.ShowWindow(SW_HIDE); } else { m_BtnEditAnzBack.ShowWindow(SW_SHOW); m_BtnEditAnzNext.ShowWindow(SW_SHOW); } m_lstCardTable.SetItemState((int)pos, LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS , LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS ); m_lstCardTable.SetFocus(); }
//Wenn back gedrückt wird void CONUView::OnEditAnzBtnBack() { POSITION pos = m_lstCardTable.GetFirstSelectedItemPosition(); m_lstCardTable.SetItemState((int)pos - 1 , NULL , LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS); if ((int)pos == 2) { m_BtnEditAnzBack.ShowWindow(SW_HIDE); m_BtnEditAnzNext.ShowWindow(SW_SHOW); } else { m_BtnEditAnzBack.ShowWindow(SW_SHOW); m_BtnEditAnzNext.ShowWindow(SW_SHOW); } m_lstCardTable.SetItemState((int)pos - 2, LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS , LVIS_SELECTED | LVIS_FOCUSED | LVS_SHOWSELALWAYS ); m_lstCardTable.SetFocus(); }
-
Ich habe jetzt rausgefunden, dass wenn ich auf dem 2. Eintrag bin und dann auf back drücke, um wieder auf den 1. Eintrag zu springen, folgendes ausgeführt wird:
in OnEditAnzBtnBack()if ((int)pos == 2) { m_BtnEditAnzBack.ShowWindow(SW_HIDE); m_BtnEditAnzNext.ShowWindow(SW_SHOW); }
springt er sofort nach m_BtnEditAnzBack.ShowWindow(SW_HIDE); in die OnSetfocusList(NMHDR* pNMHDR, LRESULT* pResult). Zu diesem Zeitpunkt ist aber natürlich kein Eintrag mehr ausgewählt, da der erst danach wieder gesetzt wird (Ich werd mal gleich nach dme löschen der Markierung die neue setzen und erst danach die Buttons anzeigen bzw ausblenden lassen)
Aber wieso springt er in die OnSetfocusList() ?