List Control Probleme

PinkoPalino

Grünschnabel
Hi!
Ich habe in meinem Programm eine List Control in Report-Ansicht.
Das hinzufügen von Spalten und Items funktioniert Prima.

Problem 1:
Aber wenn ich alle Spalten Löschen will, bleiben immer welche übrig.
Hier der relevante Code:
Code:
	CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
	int nColCount = pHC->GetItemCount();
	for (int i=0; i< nColCount; i++)
        m_Messr_List.DeleteColumn(i);
	m_Messr_List.InsertColumn(colum,"Messreihe",LVCFMT_LEFT,100);

Problem 2:
Wie kann ich die List Control so konfigurieren, dass beim Markieren eines Items die ganze Zeile markiert wird?

Problem 3:
Wie kann ich das letzte Element markieren und automatisch dort hin scrollen?

Danke
 
Zuletzt bearbeitet:
Hallo,

1. Du löschst die Spalten von vorn. Dadurch verschiebt sich bei jedem Mal der Spalten-Index. Irgendwann übersteigt dann i die Anzahl der noch vorhandenen Spalten. Du mußt die Spalten von hinten beginnend löschen.
Code:
for (i=ColumnCount-1;i>=0;i--)
    m_Messr_List.DeleteColumn(i);
Allerdings bin ich mir nicht sicher, ob du wirklich die Spalten löschen willst. Denn in deinem Quelltext besorgst du dir die Anzahl der Items.

2.
Code:
m_Messr_List.SetExtendedStyle(LVS_EX_FULLROWSELECT);
3.
Code:
m_Messr_List.SetSelectionMark(m_Messr_List.GetItemCount());
Nicht ganz sicher bin ich mir, ob die markierte Zeile automatisch angezeigt wird.

Mfg

langer
 
Zuletzt bearbeitet:
Laut diesem Beitrag:
http://www.tutorials.de/forum/visualstudio-mfc/228472-clistctrl-anzahl-der-spalten-ermitteln.html
wird mit
Code:
	CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
	int nColCount = pHC->GetItemCount();
die Anzahl der Spalten ermittelt.

Das mit
Code:
m_Messr_List.SetSelectionMark(m_Messr_List.GetItemCount());
Habe ich bereits versucht (man muss bei GetItemCount noch -1 machen, damit letztes).
Aber es wird in der Liste nicht angezeigt, dass das Letzte markiert wurde und auch nicht automatisch dort hin gescrollt. Aber das Item wird im Hintergrund ausgewählt.
gibt es irgendwie eine Möglichkeit, das markierte Item anzuzeigen?

Danke trozdem. Den anderen Code kann ich erst am Montag ausprobieren.
 
Hallo,

da hast du recht mit dem Header-Control.

Und für das Selektieren geht vielleicht besser
Code:
SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);

Mfg

langer
 
Also jetzt habe ich mal alles getestet:
Die Spalten muss man wie folgt löschen, da sich, wie langer1801 bereits erwähnte, die Spaltennnummer immer wieder nach vorne schiebt:
Code:
	CHeaderCtrl* pHC = m_Messr_List.GetHeaderCtrl(); //Anzahl der Spalten ermitteln
	int nColCount = pHC->GetItemCount();
	for (int i=0; i< nColCount; i++)
        m_Messr_List.DeleteColumn(0);

Die gesamte Zeile wird jetzt beim Klicken auch markiert.

Aber das letzte Problem funktioniert leider noch nicht.
Mit dem Code
Code:
SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);
hat sich eigentlich nichts geändert.
Ich habe folgendes geschrieben:
Code:
	int nIndex = m_Messr_List.GetItemCount()-2;
	m_Messr_List.SetSelectionMark(nIndex);
	m_Messr_List.SetItemState(nIndex,LVIS_SELECTED, LVIF_STATE);

Aber leider wird die Auswahl nicht angezeigt.

Zusätzlich habe ich noch folgende Fragen:
4. Wenn man mehrere Elemente ausgewählt hat, wie bekommt man deren Indexe?

5. Wenn ich z.B: zwei ListConrtol auf meinem Formular habe, beim ersten etwas auswähle und dann beim zweiten klicke, wird die Markierung beim ersten gelöscht?! Warum. Kann man das irgendwie abstellen?

6. Welches Ereignis muss ich bei der ListConrtol auswählen, wenn ich auch darauf reagieren will, wenn der User mit den Pfeiltasten die Markierung ändert. Momentan funktionierts nur beim Klicken (Ich habe NM_CLICK ausgewählt)

Danke
 
Zuletzt bearbeitet:
Hallo,

habe was für deine 4-Frage

Code:
	CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_PROPERTY_LIST);

	UINT i, uSelectedCount = pmyListCtrl->GetSelectedCount();
	int  nItem = -1;
	CString str;

	// Update all of the selected items.
	if (uSelectedCount > 0)
	{
		for (i=0; i < uSelectedCount; i++)
		{
			nItem = pmyListCtrl->GetNextItem(nItem, LVNI_SELECTED);
			ASSERT(nItem != -1);

			//tu irgendwas mit dem Item 
		}
	}
 
6. Welches Ereignis muss ich bei der ListConrtol auswählen, wenn ich auch darauf reagieren will, wenn der User mit den Pfeiltasten die Markierung ändert. Momentan funktionierts nur beim Klicken (Ich habe NM_CLICK ausgewählt)


Würde ich "LVN_ITEMCHANGED" nehmen,
dabei muss aber berücksichtigt werden, dass das Ereignis auch unter anderem
beim Einfügen der Items ausgelöst wird
 
5. Wenn ich z.B: zwei ListConrtol auf meinem Formular habe, beim ersten etwas auswähle und dann beim zweiten klicke, wird die Markierung beim ersten gelöscht?! Warum. Kann man das irgendwie abstellen?

mit
pCtrl->SetExtendedStyle(..)
kannst du dein ListCtrl stylen.

Schau dir in der Online-Hilfe
LVS_EX_TRACKSELECT an
 
Hi titanic
Ich habe jetzt das für das 6. Problem versucht. Das müsste Funktionieren.

Zum 5. Problem habe ich auch versucht. Aber wenn ich pCtrl->SetExtendedStyle(LVS_EX_TRACKSELECT) verwende, funktioniert das FullRowSelect nicht mehr (es wird beim Klicken keine Markierung angezeigt), oder kann man zwei solche Styles kombinieren?
Weiters habe ich nachgesehen, was TrackSelect überhaupt macht. Hier der Text aus der Online-Hilfe:
LVS_EX_TRACKSELECT
Version 4.70. Enables hot-track selection in a list-view control. Hot track selection means that an item is automatically selected when the cursor remains over the item for a certain period of time. The delay can be changed from the default system setting with a LVM_SETHOVERTIME message. This style applies to all styles of list-view control. You can check whether hot-track selection is enabled by calling SystemParametersInfo.

Soweit ich das verstehe, wird damit nur ein Item autom. ausgewählt, wenn man sich länger darüber mit dem Mauszeiger befindet, oder löst das mein Problem 5?

Das zu Problem 4 muss ich erst noch einbauen, aber das dürfte eigentlich funktionieren.

Danke
 
Hi,
Zum 5. Problem habe ich auch versucht. Aber wenn ich pCtrl->SetExtendedStyle(LVS_EX_TRACKSELECT) verwende, funktioniert das FullRowSelect nicht mehr (es wird beim Klicken keine Markierung angezeigt), oder kann man zwei solche Styles kombinieren?

Ja und zwar so:

pCtrl->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_TRACKSELECT );

Gruß
titanic
 

Neue Beiträge

Zurück