Makale numarası: 250614 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 1.2

Rapor Görünümü'nde bir CListCtrl sıralama öğeleri nasıl

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Özet

Öğelerin ListView denetiminde, özellikle bir CListCtrl MFC sınıfı tarafından alınmış sıralama işlemi için değil kadar bilgi sağlanmadı. Ayrıntıları uygulamak kolay ve bu makalede, belgelerde, bu kullanışlı bir özellik için boşluk doldurmak çalışır. Kod örneği, MFC bir iletişim kutusu ile liste denetimi LVS_REPORT stiline ayarlamak temsil eder.

Daha fazla bilgi

Denetim ListView öğeleri sıralamak için olması gerekir öğe ile ilişkilendirilen bir LVITEM yapısı. MFC için makul varsayılanlarla birlikte yapısını oluşturur basit InsertItem(int nItem, LPCTSTR lpszItem) işlev çağrısı eklenecek bir öğe sağlayarak geliştirici, bu sağlar. Bazen bir tür arabelleğinden temel karmaşıklık yanıltıcı olabilir. Ancak, LVITEM yapısını sıralama düzenek de dahil olmak üzere, ListView öğeleri işlemek için önemli bir anahtardır.

LVITEMlParam öğesinin, gerekli bilgileri sağlar. CListCtrl sınıfının SortItems işlevi çağrıldığında, bir <a0>Sıralama</a0> geri arama işlevi ve bir uygulama tanımlı bir DWORD değeri için bir işlev işaretçisi sağlamanız gerekir. Karşılaştırma için iki liste denetimi öğeleri seçili olarak sırasında sıralama, art arda geri çağırma işlevi çağrılır. Her maddenin LVITEM yapısı lParam öğesinden aldığı parametreleri; DWORD değerini SortItems çağrı tarafından geçirildi.

Aşağıdaki kod, on ABD Presidents ListView denetimde listesini sıralamak için basit bir örnek temsil eder. The presidents, başlangıçta bir statik çok boyutlu CString dizisinde depolanır.

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") }
};
				

Geri arama sıralama işlevi statik bir sınıfın bir üyesi olarak veya yalnızca genel bir işlevi olarak, burada olarak tanımlanabilir:
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
				

LParam öğesi için çok karmaşık basit gelen herhangi bir şey olabilir. Genellikle, bir yapı başvurulacak verilerin birden çok parça sağlayarak bu bağlamda, yararlıdır. Bu örnekte, belirli bir öğe içeren üç öğeleri tutulacağı ITEMDATA adlı bir yapı tanımlanmıştır:
typedef struct {
	LPTSTR pszLastName;
	LPTSTR pszFirstName;
	LPTSTR pszTerm;
} ITEMDATA, *PITEMDATA;
				

Bu örnekte, yapısı CDialog sınıf üstbilgi dosyasında tanımlanan ve üye değişkeni dizi 10 işaretçinin tanımlanmıştır:
	ITEMDATA* m_pData[10];
				

Bir liste görünümü denetimi için bir iletişim kutusu eklenmiştir ve üye değişkeni tanımlı m_ctlListView denir. Öğeleri OnInitDialog eklenmiştir:

	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]);
	}
				

Üç sütun, son adını, adını ve office koşulları için eklenmiş. Sonra her on maddeler için yeni bir ITEMDATA yapısı ayrılan ve CString diziden başlatıldı. Maddenin, yalnızca dizin ve son adı dizesini kullanarak çok yalnızca eklenir, sonra metni maddenin diğer iki sütun için ayarlanır. Son olarak, işlev SetItemData, parametre olarak yeni ITEMDATA geçirmeden denir. Bu maddenin LVITEM yapısının lParam reinitializes ve sıralama için şekilde hazırlar.

Visual C++ 6.0 MFC ListView denetimi üstbilgisi bildirimleri ile ilgili bir sorun var. Bir işleyici eklenebilir, ancak geçerli sürümünde, adı değil. Örneğin, bir Windows ileti işleyicisi eklemek için Class Wizard'ı veya WizardBar kullanın. ListView denetim KIMLIĞI vurgulanmışsa, bildirim iletilerini çok sayıda seçim için kullanılabilir. Için belirli bir sütun başlığı tıklatıldığında, öğeleri sıralamak için <a0></a0>, bildirim HDN_ITEMCLICK seçin. Bir işleyici işlevi yan? s?ra ON_NOTIFY ileti eşleme girişi oluşturulur. Giriş geçerli örnek için aşağıdaki gibi görünür:

	ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST1, OnItemclickList1)
				

Burada sorun bildirimi ListView denetimden gerçekten kaynağı yoktur; bunun yerine, ListView tarafından oluşturulan üstbilgi denetiminin bildirim gönderir.. Yukarıda listelenen ileti eşleme girdisinde çalışmaz. Düzeltme basittir, başlık denetimi her zaman KIMLIĞI 0 olduğundan, makronun doğru çalışması için yeniden düzenlenebilir ancak:
	ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)
				

Ardından OnItemclickList1 işleyicisini SortItems çağrısı yapılır:
void CSortListDlg::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
	
	m_ctlListView.SortItems(SortFunc, pLV->iItem);
	
	*pResult = 0;
}
				

Bildirim ileti üstbilgisi (NMHDR) gerçekte bir ListView, tıklattığınız sütun dizini içeren NMLISTVIEW, bildirimdir. Bu örnekte, bu iItem tarafından temsil edilir. Daha karmaşık listeler, bu yapıyı iSubItem öğeye başvuru gerekebilir. Geri arama işlevini adresini SortItems için hangi tıklatılmış sütun numarası ile birlikte geçirilir.

Karşılaştırma için ın ListView öğeleri çiftlerini işleve geçirilen gibi SortFunc yordamı sürekli olarak adlandırılır. Ilk iki parametre, ilgili öğeleri LVITEM yapısının lParam öğesi olan ve üçüncü parametre (uygulama tanımlı) SortItems çağrısında sağlanan sütun sayısıdır.
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;
}
				

Sütun dizini içinde lParamSort geçirilen lParam1 ö?eyi ITEMDATA nesneleri geçirilen belirler ve lParam2 karşılaştırma için kullanılmalıdır. Sonuç döndürdü ve işlem, tüm öğeleri sıralanmış kadar devam eder.

Uyarı mektubu, liste öğeleri için tahsis ITEMDATA yapıları sonunda özelleştirmeler gerekir. Bu örneğin, iletişim kutusu için WM_DESTROY işleyicisi üye öğeler arasında dolaşır ve bunları siler.
	for (int i=0; i<10; i++)
		delete m_pData[i];
				

Referanslar

ListView ortak denetimi hakkında daha fazla bilgi için Windows ortak denetimleriKullanıcı arabirimi Hizmetleri bölümünde altında Platform SDK belgelerine başvurun.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2
Anahtar Kelimeler: 
kbmt kbcmnctrls kbctrl kbhowto kblistview KB250614 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:250614  (http://support.microsoft.com/kb/250614/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.