如何实现VC中ListControl控件的排序

 我来答
匿名用户
推荐于2018-04-14
展开全部

简单实现MFC ListControl 点击列头排序

第一步:

定义全局变量:

int sort_column; // 记录点击的列
bool method; // 记录比较方法

第二步:

添加比较函数

// 比较函数
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// 从参数中提取所需比较lc的两行数据
int row1 = (int) lParam1;
int row2 = (int) lParam2;
CListCtrl* lc = (CListCtrl*)lParamSort;
CString lp1 = lc->GetItemText(row1,sort_column);
CString lp2 = lc->GetItemText(row2,sort_column);
// 比较,对不同的列,不同比较,注意记录前一次排序方向,下一次要相反排序
if (sort_column<2)
{
// int型比较
if (method) return atoi(lp1)-atoi(lp2);
else return atoi(lp1)-atoi(lp1);
}
else
{
// 文字型比较
if (method) return lp1.CompareNoCase(lp2);
else return lp2.CompareNoCase(lp1);
}
return0;
}


第三步:添加列头点击事件  Lvn_Columnclick
void ClistDlg::OnLvnColumnclickxxx(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
sort_column = pNMLV->iSubItem;//点击的列

int count = m_list_port.GetItemCount();

for (int i=0;i<count;i++)
  m_list_port.SetItemData(i,i); // 每行的比较关键字,此处为列序号(点击的列号),可以设置为其他比较函数的第一二个参数

m_list_port.SortItems(MyCompareProc,(DWORD_PTR)&m_list_port);//排序第二个参数是比较函数的第三个参数

*pResult =0;
}

完成。

method是用来控制顺序逆序的,看个人情况设置。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式