CListCtrl -> automatisches anezgen und scrollen an eine markierte stelle

Indian

Erfahrenes Mitglied
Hi


also ich hab eine CListCtrl Element deren Komponenten bzw. Zeilen über ein Suchfeld markiert werden. Die Zeile wird markiert jedoch wird scrollt die CListCtrl nicht automtisch zum markierten zeile.

Wie kann ich das machen. hier ist mein code welcher denn zu suchenden string mit dem inhalt buchstabe für buchstabe vergleicht.

Code:
void CListAllDlg::OnEnChangeSearch()
{
	CString m_ListItem="", m_Search="", m_String;
	int length = 0;
	int nItems = 0;
	bool found = false;

	length = GetDlgItemText(IDC_SEARCH,m_Search);//GetDlgItem return the length of the text
	nItems = m_list_all.GetItemCount();

	for(int pos = 0; pos < nItems; pos++)
	{
		m_String="";
		m_ListItem = m_list_all.GetItemText(pos,1);
		for(int i = 0; i < length; i++)
		{
			m_String += m_ListItem.GetAt(i);
		}//end for

		if (strcmp(m_String,m_Search) == 0)
		{
			m_list_all.SetItemState(pos, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
			break;
		}//end if
	}//end for
}//end OnEnChangeSearch()
 
Die Zeile wird markiert jedoch wird scrollt die CListCtrl nicht automtisch zum markierten zeile.
Da empfehle ich CListCtrl::EnsureVisible().

Ansonsten kannst du die CStrings, die dir GetItemText() zurückgibt, auch direkt vergleichen, anstatt sie umständlich erstmal in einzelne Chars zu zerlegen. Sieh mal in die Dokumentation zu CString.

Mehr zu dem Thema findest du dann möglicherweise in meinem Tutorial, das ich im Rahmen des Contests erstelle, und das hoffentlich noch rechtzeitig fertig wird. Schnell noch ein bischen werben: Bald in dieser Domain! ! Mein CListCtrl-Tutorial! ! Neu! ! Jetzt mit doppeltem Ausrufezeichen! ! :)
 
super vielen dank, funktioniert prima

mal ne frage. ich hab ne combo box... welche 2 einträge hat Lebensmittel und Kosmetik. Selektiere ich "Lebensmittel" wird beim ersten mal nicht sofort alle Lebensmittel angezeigt. Ich muss 2 bzw. 3mal selektieren bis es funktioniert und das auch nicht richtig. Manchmal erscheint statt Lebensmittel statt Kosmetik.

Habe denn verdacht das die CListCtrl komponente nicht richtig refresht. Denn die If Anweisung ist eigentlich in Ordnung

Indian
 
Hm? Was denn eine Combo und eine Liste? Oder wie? Klar, da kann einiges schiefgehen, aber ohne Weiteres (z.B.) kann ich da keinen Rat geben.
 
nein die combobox ist nicht in der CListCtrl sondern seperat auf dem Dialog. Jedoch kann diese bestimmen welche Kategorie aufgelistet wird in der CListCtrl.

Wenn ich eine Kategorie wähle wird irgendwie nicht die Kategorie angezeigt. Wie kann ich nachdem auflisten dem Inhalt anzeigen.

Refresh evtl show ?

irgendwas läuft da schief... hier der code wenn sich in der combobox der inhalt sich verändert. dann wird zuerst alles gelöscht was in der ClistCtrl drin ist und je nach auswahl in der ComboBox sie wieder gefüllt. Lass dich nicht irritieren wie ich Strings der CListCtrl übergebe (Selbstgebastelte Klasse)

Code:
void CListAllDlg::OnCbnSelchangeCombo1()
{
	m_list_all.DeleteAllItems();

	CDatabase db;
	CDBVariant value;
	char sql_statement [2048] = "";
	CString m_ArticelNr="",m_ListCategory="";

	CProducts m_pData(&db);
	strcpy(sql_statement,_T("SELECT * FROM products ORDER BY articel")); 
	m_pData.Open(CRecordset::forwardOnly,sql_statement);

	GetDlgItemText(IDC_LISTCATEGORY,m_ListCategory);

	while(!m_pData.IsEOF())
	{
		if (strcmp(m_ListCategory,m_pData.m_category) == 0)//*value.m_pstring)) [B] BEDINGUNG - Je nach auswahl der Kategorie ComboBox "Lebensmittel oder "Kosmetik" wird der Inhalt von der Datenbank in die CList Ctrl eingefügt
		{
			m_ArticelNr="?Later?";
			m_list_all.AddItem(m_ArticelNr,m_pData.m_articel,m_pData.m_content,m_pData.m_price,m_pData.m_stock);
		}//end if

		m_pData.MoveNext();	
	}//end while
	db.Close();
}
 
noch eine frage.

solange ich das wort in dem Editfeld eintippe übereinstimmt mit einem String in CListCtrl wird diesse Zeile auch markiert. Aber leider ist die markiert zeile grau (ohne focus) und ich möchte das diese zeile nicht grau sonder blau (so als würder der focus gesetzt wäre).

Das problem ist das ich dann denn focus bzw. denn Cursor im Editfeld verliere. Wie kann ich denn Focus (d.h. die Markierung der Zeile in Blau haben) und denn Cursor im Editfeld ohne das ich Ihn verliere ?

Indian
 
Dann musst du das Darstellen selbst übernehmen. Den Fokus kann nur ein einziges Kontrollelement haben.
 
Zuletzt bearbeitet:
Zurück