CListCtrl -> Felder Editieren und Übernhmen

Indian

Erfahrenes Mitglied
Hi

ich hab lange gesucht jedoch nicht darüber gefunden wie ich die einzelnen Felder einer CListCtrl editieren kann.

Ich hab eine List welche in einer CListCtrl angezeigt wird. Jedoch hätte ich gerne das ich die einzelnen Felder editieren kann und das alle die geändert wurden auch übernehme und speicher kann.

Weiss das zufällig jemand wie das geht

Danke,
Indian
 
Mit GetItemText() und SetItemText() kommst du an die Texte ran. Wenn du einzelne "Zellen" in einer mehrspaltigen Tabelle editieren willst, musst du zum Beispiel einen Handler für Klicks auf die Liste (z.B. OnClickeListe() mit NM_CLICK, siehe Classwizard) verwenden, in dem du mittels SubItemHitTest() prüfst, welches Item/Subitem (==Zelle) geklickt wurde. Den Inhalt dieser Zelle kannst du dir dann holen und zum Beispiel in einem kleinen DIalog mit einem CEdit editieren.

Oder habe ich dich falsch verstanden, und du willst Items sozusagen "umbenennen", so wie im Explorer? Dann verweise ich auf EditLabel().
 
nein ich möchte das feld direkt in der CListCtrl editieren, die Idee mit einem sepratem CEdit feld und Dialog hatte ich auch.

dummerweise kann ich nur die erste spalte in CListCtrl editieren und der eingegeben Wert kann auch nicht übernohmen werden. Sobald ich enter Drücke steht der alte wert wieder drin. Die anderen Spalten sind nicht editier bar

Das müsste doch möglich sein
 
Zuletzt bearbeitet:
Ja, das habe ich mal gemacht. Es ist aber recht knifflig. Ich habe dazu erstmal festgestellt, welches Subitem editiert werden soll, dann die Maße berechnet und an der Stelle ein "frei herumhängendes" Window eingeblendet -- eine Instanz einer von mir gebauten, von CEdit abgeleiteten Klasse. Da konnte (kann) man dann ebenso editieren wie in der ersten Spalte. Im Prinzip habe ich so ein eigenes Labeledit erzeugt. Das ist aber wirklich etwas kniffliger; ich müsste da auch noch suchen, wie ich es genau gemacht habe, und die betreffenden Stellen aus dem recht fetten Projekt, dessen Bestandteil es war, raussuchen. Das würde etwas dauern, könnte ich aber machen.

Ansonsten rate ich dir erstmal zu der Lösung mit dem Dialog.
 
hmm.. das wäre nett

wenn ich mal sagen darf es ist .... BESCHEUERT..... diese funktion müsste es doch geben ? ich hab eine für CListView gefunden jedoch nicht für CListCtrl


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
 
nope... kein Thread... ich hab zwar ein problem mit 2 threads das ich nicht seit 2 monaten lösen kann. aber das hab ich nun mal zurück gestellt.

ich hab ne funktion die bei einer Tasteneingabe reagiert. hier der code

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

		//compare strings no case sensitive
		if ((m_String.CompareNoCase(m_Search)) == 0) 
		{
 Hier markiere ich die Zeile jedoch wenn ich denn focus setze verliere ich Ihn im Textfeld. Zwar wird die zeile markiert aber nur grau ist nämlich schlecht zu sehen, daher möchte ich es blau (highlighted)
			m_list_all.SetItemState(pos, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
			m_list_all.EnsureVisible(pos,false); //autoscroll to highlighted and selected row
			break;
		}//end if
	}//end for
}//end OnEnChangeSearch()
 
Zuletzt bearbeitet:
Klar kannst du das, aber muss ja nicht zweimal sein. Abgesehen davon kann ich dir dabei nicht auf einfache Weise weiterhelfen.
 

Neue Beiträge

Zurück