Artikel-ID: 250614 - Geändert am: Dienstag, 21. November 2006 - Version: 1.2

So sortieren von Elementen in ein CListCtrl in Bericht anzeigen

SystemtippDieser Artikel bezieht sich auf ein anderes Betriebssystem als das von Ihnen verwendete. Für Sie möglicherweise nicht relevante Artikelinhalte wurden deaktiviert.
Alles erweitern | Alles schließen

Zusammenfassung

Für den Prozess der Sortierung der Elemente in einem ListView-Steuerelement, insbesondere eine eingebundenes CListCtrl MFC-Klasse wurde nicht viele Informationen bereitgestellt. Die Details sind leicht zu implementieren, und in diesem Artikel versucht, die Lücke in der Dokumentation dieses nützliche Feature. Im Beispielcode stellt ein MFC-Dialogfeld mit einem Listensteuerelement legen Sie die Formatvorlage LVS_REPORT dar.

Weitere Informationen

Um die Elemente in einem ListView-Steuerelement zu sortieren, muss eine dem Element zugeordnete LVITEM Struktur vorhanden sein. MFC bietet dies für Entwickler, ermöglicht ein Element mit einem einfachen InsertItem(int nItem, LPCTSTR lpszItem) Funktionsaufruf eingefügt werden, die die Struktur mit angemessenen Standardeinstellungen erstellt. Solche ein Puffer von der zugrunde liegenden Komplexität kann manchmal irreführend sein. Die Struktur LVITEM ist jedoch ein wichtiger Schlüssel zum Bearbeiten von ListView-Elemente, einschließlich des Sortierung Mechanismus.

Das lParam -Element der LVITEM Informationen erforderlichen. Wenn die Funktion SortItems CListCtrl -Klasse aufgerufen wird, muss Sie einen Funktionszeiger auf eine Rückruffunktion sortieren und einen anwendungsdefinierten DWORD- Wert bereitstellen. Während der Sortierung wird die Callback-Funktion wiederholt aufgerufen, wie zwei Elemente im Listensteuerelement für den Vergleich ausgewählt sind. Der Parameter, die er empfängt, das lParam Element jedes Elements LVITEM Struktur sind und der DWORD- Wert durch den Aufruf SortItems übergeben.

Der Code unten stellt ein einfaches Beispiel Sortieren einer Liste der zehn US Presidents in einem ListView-Steuerelement dar. Die Presidents werden zunächst in ein statisches mehrdimensionalen CString-Array gespeichert.

static CString strData[10][3] =
{
	{ _T("Washington"), _T("George"), _T("1789-1797") },
	{ _T("Adams"), _T("John"), _T("1797-1801") },
	{ _T("Jefferson"), _T("Thomas"), _T("1801-1809") },
	{ _T("Madison"), _T("James"), _T("1809-1817") },
	{ _T("Monroe"), _T("James"), _T("1817-1825") },
	{ _T("Adams"), _T("John Quincy"), _T("1825-1829") },
	{ _T("Jackson"), _T("Andrew"), _T("1829-1837") },
	{ _T("Van Buren"), _T("Martin"), _T("1837-1841") },
	{ _T("Harrison"), _T("William Henry"), _T("1841") },
	{ _T("Tyler"), _T("John"), _T("1841-1845") }
};
				

Die Rückruffunktion sortieren kann statisch als Member einer Klasse oder als hier einfach als globale Funktion definiert werden:
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
				

Das lParam-Element kann alles von einfach bis sehr komplex sein. Häufig empfiehlt sich eine Struktur in diesem Kontext ermöglicht mehrere Teile der Daten auf die verwiesen werden soll. Für dieses Beispiel wurde eine Struktur namens ITEMDATA definiert, um die drei Elemente, die ein bestimmtes Element enthalten:
typedef struct {
	LPTSTR pszLastName;
	LPTSTR pszFirstName;
	LPTSTR pszTerm;
} ITEMDATA, *PITEMDATA;
				

In diesem Beispiel wird die Struktur wurde in einer von CDialog -Klasse Headerdatei definiert, und eine Membervariable eines Zeigers auf ein Array von 10 definiert wurde:
	ITEMDATA* m_pData[10];
				

Ein Dialogfeld ein ListView-Steuerelement hinzugefügt wurde, und eine Membervariable definiert M_ctlListView aufgerufen. Die Elemente wurden in OnInitDialog hinzugefügt:

	m_ctlListView.InsertColumn(0, _T("Last Name"), LVCFMT_LEFT, 100);
	m_ctlListView.InsertColumn(1, _T("First Name"), LVCFMT_LEFT, 100);
	m_ctlListView.InsertColumn(2, _T("Term"), LVCFMT_LEFT, 100);

	for (int i=0; i<10; i++)
	{
		m_pData[i] = new ITEMDATA;
		m_pData[i]->pszLastName = (LPTSTR)(LPCTSTR)strData[i][0];
		m_pData[i]->pszFirstName = (LPTSTR)(LPCTSTR)strData[i][1];
		m_pData[i]->pszTerm = (LPTSTR)(LPCTSTR)strData[i][2];

		m_ctlListView.InsertItem(i, strData[i][0]);
		m_ctlListView.SetItemText(i, 1, strData[i][1]);
		m_ctlListView.SetItemText(i, 2, strData[i][2]);
		m_ctlListView.SetItemData(i, (LPARAM)m_pData[i]);
	}
				

Letzte Namen, Vornamen und Begriff von Office wurden drei Spalten eingefügt. Für jedes der 10 Elemente, wird eine neue ITEMDATA Struktur anschließend zugeordnet und von CString-Array initialisiert. Das Element wird eingefügt sehr einfach nur der Index mit der letzten Zeichenfolge, dann der Text für die beiden anderen Spalten des Elements festgelegt ist. Schließlich wird die Funktion SetItemData aufgerufen neue ITEMDATA als Parameter übergeben. Diese lParam des Artikels LVITEM Struktur initialisiert und bereitet die Möglichkeit für die Sortierung vor.

MFC in Visual C++ 6.0 hat ein Problem mit Header Benachrichtigungen für das ListView-Steuerelement. Obwohl ein Handler hinzugefügt werden kann, ist nicht in der aktuellen Version es aufgerufen. Verwenden Sie z. B. Class-Assistenten oder die Assistentenleiste zum Hinzufügen eines Meldungshandlers Windows. Wenn die ID für das ListView-Steuerelement hervorgehoben ist, gibt eine Reihe von Benachrichtigungsmeldungen zur Auswahl zur Verfügung. Wählen Sie Benachrichtigung HDN_ITEMCLICK , um die Elemente zu sortieren, wenn die Kopfzeile für eine bestimmte Spalte geklickt wird. Ein Meldungszuordnungseintrag ON_NOTIFY wird sowie eine Handlerfunktion generiert. Für das aktuelle Beispiel wird der Eintrag wie folgt angezeigt:

	ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST1, OnItemclickList1)
				

Das Problem besteht hier darin, dass die Benachrichtigung von ListView-Steuerelement tatsächlich stammen nicht; stattdessen das Header-Steuerelement erstellt, indem der ListView sendet die Benachrichtigung. Die oben aufgeführten Nachrichtenzuordnungseintrag funktioniert nicht. Das Update ist einfach, jedoch, da das Kopfzeilen-Steuerelement immer eine Kennung von 0 hat, das Makro kann bearbeitet werden ordnungsgemäß funktioniert:
	ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)
				

Dann wird in der OnItemclickList1-Handler der SortItems Aufruf vorgenommen:
void CSortListDlg::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
	
	m_ctlListView.SortItems(SortFunc, pLV->iItem);
	
	*pResult = 0;
}
				

Der Benachrichtigung-Nachrichtenkopf ( NMHDR ) ist tatsächlich eine ListView Benachrichtigung, NMLISTVIEW , mit den Index der Spalte, auf die geklickt wurde. In diesem Beispiel wird dies von iItem dargestellt. Komplexere Listen müssen möglicherweise das iSubItem -Element der sowie diese Struktur verweisen. Die Adresse der Callback-Funktion ist an SortItems zusammen mit der Spalte Anzahl übergeben, die auf den geklickt wurde.

Die SortFunc-Routine wird wiederholt aufgerufen, als Paare von der ListView-Elemente für den Vergleich an die Funktion übergeben werden. Die ersten beiden Parameter sind die lParam -Element der die jeweiligen Artikel LVITEM Struktur; der dritte Parameter (anwendungsdefinierte) ist die Spaltennummer in der SortItems Aufruf zur Verfügung gestellt.
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	int nRetVal;

	PITEMDATA pData1 = (PITEMDATA)lParam1;
	PITEMDATA pData2 = (PITEMDATA)lParam2;


	switch(lParamSort)
	{
	case 0:	// Last Name
		nRetVal = strcmp(pData1->pszLastName,
                                 pData2->pszLastName);
		break;

	case 1:	// First Name
		nRetVal = strcmp(pData1->pszFirstName,
                                 pData2->pszFirstName);
		break;

	case 2: // Term
		nRetVal = strcmp(pData1->pszTerm, pData2->pszTerm);
		break;

	default:
		break;
	}

	return nRetVal;
}
				

Der Spaltenindex in lParamSort übergeben bestimmt, welches Element der Objekte ITEMDATA in lParam1 übergeben und lParam2 sollte für den Vergleich verwendet werden. Das Ergebnis wird zurückgegeben, und der Prozess wird fortgesetzt, bis alle Elemente sortiert wurden.

Als Erinnerung müssen die ITEMDATA-Strukturen die für die Listenelemente zugeordnet wurden schließlich gelöscht werden. Der WM_DESTROY -Handler für das Dialogfeld für dieses Beispiel durchläuft die Member-Elemente und gelöscht.
	for (int i=0; i<10; i++)
		delete m_pData[i];
				

Informationsquellen

Weitere Informationen auf dem common ListView-Steuerelement finden Sie in der Platform SDK -Dokumentation unter Windows Common Controls im Abschnitt User Interface Services .

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2
Keywords: 
kbmt kbcmnctrls kbctrl kbhowto kblistview KB250614 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 250614  (http://support.microsoft.com/kb/250614/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Retired KB ArticleDisclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.