[gelöst] CListCtrl: Markierung einer Zeile in einer Liste löschen
-
Hallo,
ich suche in einer Liste nach einem bestimmten Artikel. Wenn der Artikel gefunden wurde, dann soll er in der Liste markiert werden. Das Markieren funktioniert auch. Mein Problem ist jetzt, dass beim Suchen des nächsten Artikels der vorher gefundene noch immer markiert ist. Hier mein Code:
long nummer = atoi(dlg.m_strnummer); if(dlg.m_strnummer!= "" ) { //meine selbstgeschriebene Funktion zum Suchen, i ist der Index int i = GetDocument()->myLager.suchen(nummer, Datenverwaltung::ARTIKEL); //markiert die Zeile, in der der gefundene Artikel steht m_ListView.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); }
Über eure Hilfe würde ich mich freuen
-
Grundsätzlich ist es möglich in einem ListCtrl mehrere Items zu markieren (so genau find ich das jetzt allerdings auf die Schnelle nicht in der msdn), deshalb bleibtder alte Artikel meines Wissens nach auch markiert.
Das einfachste ist, vor der Suche den entsprechenden Artikel zu demarkieren (falls Du ihn geeignet merken kannst) oder alle Artikel zu demarkieren, falls nur der gefundene Artikel markiert werden soll.
-
Mit welchem Befehl mache ich das denn? Hab es so probiert:
m_ListView.SetItemState(i, LBN_KILLFOCUS, LBN_KILLFOCUS);
Das hat aber nicht funktioniert. Sonst habe ich nichts brauchbares finden können.
-
Ich hab folgendes gefunden, vielleicht hilft dir das weiter:
http://www.eggheadcafe.com/software/aspnet/32931702/removing-item-highlight-f.aspx
I would try using SetItemState() to set the highlight to look like what you
want. If you are actually selecting something (not just listing a bunch of
lines to look at) you may want to at least display a focus rectangle around
the current item, but you could get rid of the highlight by making a call
like:To unhighlight an item and unfocus it
lc.SetItemState(nItem, LVIS_FOCUSED|LVIS_SELECTED);To highlight the item
lc.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);To unhighlight and focus it:
lc.SetItemState(nItem,LVIS_SELECTED);
lc.SetItemState(nItem, LVIS_FOCUSED, LVIS_FOCUSED);You could clear all of the bits by using -1 for the statemask, but you may
clear something you don't want cleared like state or overlay image (like in
displaying shortcut arrows and stuff)http://msdn.microsoft.com/en-us/library/9t97k8h9(VS.80).aspx
http://support.microsoft.com/kb/173242
http://msdn.microsoft.com/en-us/library/bb774733(VS.85).aspx
-
m_ListView.SetItemState(nItem, NULL, LVIS_SELECTED);
-
Hallo,
vielen Dank für eure Antworten. Hab es beides ausprobiert und es funktioniert mit beidem
Vielleicht könnt ihr mir noch erklären, was genau "state" und "mask" machen.
-
"state" gibt die Werte an, die gesetzt werden sollen.
Im Besispiel von Tester2, welches ich persönlich schicker finde, ist es eben Null (also quasi reset)."mask" maskiert die Bits, die gesetzt werden solle. Das kannst Du dir wie eine Schablone vorstellen, die über den State des Items gelegt wird, um nur bestimmte Werte zu ändern.
Im Beispiel: LVIS_SELECTED ist definiert als 0x0002, also wird das vorletzte Bit zurückgesetzt.
-
Ok, hab ich soweit verstanden. Vielen Dank.