对ListCtrl列表控件按列进行排序

新建一个对话框工程,拖一个列表控件,ID是IDC_LIST,属性是Report报表模式。

在对话框的初始化函数OnInitDialog()中对列表框进行初始化,初始化为一个具有三列的列表框,分别为:编号、姓名、国家。

然后在拖三个按钮。第一个按钮控制按列表控件的第一列进行循环排序;第二个按钮控制按列表控件的第二列名字的汉语拼音由大向小排列,第三个按钮控制按列表控件的第三列国家的ASCII码值由小到大进行排列。

为列表控件绑定一个变量m_List,定义一个BOOL型变量bFlag控制按第一列循环排序,在定义三个排序函数:

public:
	CListCtrl m_List;
	static BOOL bFlag;
	int static CALLBACK CompareByNum(LPARAM lP1, LPARAM lP2, LPARAM lP);
	int static CALLBACK CompareByName(LPARAM lP1, LPARAM lP2, LPARAM lP);
	int static CALLBACK CompareByNation(LPARAM lP1, LPARAM lP2, LPARAM lP);

bFlag进行初始化:
BOOL CListSortDlg::bFlag = TRUE;

在cpp文件中,首先初始化列表控件,具有三列:

BOOL CListSortDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	//............	

	m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	m_List.InsertColumn(0,"编号",LVCFMT_CENTER,180,-1);//插入三个标头

	m_List.InsertColumn(1,"姓名",LVCFMT_CENTER,180,-1);

	m_List.InsertColumn(2,"国籍",LVCFMT_CENTER,180,-1);

	int nCount = m_List.GetItemCount();//插入第一行

	m_List.InsertItem(nCount,"1001");

	m_List.SetItemText(nCount,1,"李四");

	m_List.SetItemText(nCount,2,"China");

	nCount = m_List.GetItemCount();//插入第二行

	m_List.InsertItem(nCount,"1004");

	m_List.SetItemText(nCount,1,"王五");

	m_List.SetItemText(nCount,2,"Japan");

	nCount = m_List.GetItemCount();//插入第三行

	m_List.InsertItem(nCount,"1003");

	m_List.SetItemText(nCount,1,"张三");

	m_List.SetItemText(nCount,2,"Usa");

	nCount = m_List.GetItemCount();//插入第四行

	m_List.InsertItem(nCount,"1005");

	m_List.SetItemText(nCount,1,"张婷");

	m_List.SetItemText(nCount,2,"Uk");

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

按钮响应函数和排序函数:

int CALLBACK CListSortDlg::CompareByNum(LPARAM lP1, LPARAM lP2, LPARAM lP)
{
	CListSortDlg* pThis = (CListSortDlg*)lP;

	//分别获取参与排序的两个行的编号

	int nNum1 = atoi(pThis->m_List.GetItemText(lP1,0));

	int nNum2 = atoi(pThis->m_List.GetItemText(lP2,0));

	//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换
	//bFlag控制按编号进行循环排列,大->小、小->大、大->小、小->大......等等循环。

	if(bFlag) return nNum1 > nNum2;

	else      return nNum2 > nNum1;
}

int CALLBACK CListSortDlg::CompareByName(LPARAM lP1, LPARAM lP2, LPARAM lP)
{
	CListSortDlg* pThis = (CListSortDlg*)lP;

	//分别获取参与排序的两个行的姓名

	CString str1 = pThis->m_List.GetItemText(lP1,1);

	CString str2 = pThis->m_List.GetItemText(lP2,1);

	//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换

	return str1 < str2;//按照名字的汉语拼音,由大向小排列
}

int CALLBACK CListSortDlg::CompareByNation(LPARAM lP1, LPARAM lP2, LPARAM lP)
{
	CListSortDlg* pThis = (CListSortDlg*)lP;

	//分别获取参与排序的两个行的国家

	CString str1 = pThis->m_List.GetItemText(lP1,2);

	CString str2 = pThis->m_List.GetItemText(lP2,2);

	//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换

	return str1 > str2;//按照国家的ASCII码值进行排列,由小到大
}

void CListSortDlg::OnBnClickedBtn1()//按编号排序
{
	bFlag = !bFlag;

	int nCount = m_List.GetItemCount()-1;

	while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2
	{
		m_List.SetItemData(nCount,nCount);

		nCount--;
	}

	m_List.SortItems(CompareByNum,(DWORD_PTR)this);
}


void CListSortDlg::OnBnClickedBtn2()//按姓名排序
{
	bFlag = !bFlag;

	int nCount = m_List.GetItemCount()-1;

	while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2
	{
		m_List.SetItemData(nCount,nCount);

		nCount--;
	}

	m_List.SortItems(CompareByName,(DWORD_PTR)this);
}


void CListSortDlg::OnBnClickedBtn3()//按国籍排序
{
	bFlag = !bFlag;

	int nCount = m_List.GetItemCount()-1;

	while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2
	{
		m_List.SetItemData(nCount,nCount);

		nCount--;
	}

	m_List.SortItems(CompareByNation,(DWORD_PTR)this);
}

以按姓名排列为例,如图:

对ListCtrl列表控件按列进行排序_第1张图片



你可能感兴趣的:(MFC界面)