关于listcontrol点击列表头 实现排序和你需排序的问题
我的目的是实现listcontrol中 点击某一列列头时,可以实现本列的排序,再次点击实现逆序排序。
我的代码如下:
全局变量
int sort_column; //标记点击排序的列
int method[100]; //标记排序为逆序或者顺序
int nrow=0;
初始化
m_listcontrol.InsertColumn(0,"count");
m_listcontrol.InsertColumn(1,"input numbers");
m_listcontrol.InsertColumn(2,"results");
CRect userRect;
m_listcontrol.GetClientRect(userRect);
m_listcontrol.SetColumnWidth(0,userRect.Width()/5);
m_listcontrol.SetColumnWidth(1,userRect.Width()/5);
m_listcontrol.SetColumnWidth(2,userRect.Width()*3/5);
添加项目
m_listcontrol.InsertItem(nrow,count);
m_listcontrol.SetItemText(nrow,1,input);
m_listcontrol.SetItemText(nrow,2,output);
nrow++;
比较函数
static int CALLBACK MyCompareProc(LPARAM lParam11, LPARAM lParam12, LPARAM lParam1sort)
{
int row1=(int )lParam11;
int row2=(int )lParam12;
CListCtrl *lc =(CListCtrl *)lParam1sort;
CString lp1=lc->GetItemText(row1,sort_column);
CString lp2=lc->GetItemText(row2,sort_column);
if(sort_column==1)
if(method[sort_column])
{
method[sort_column]=1-method[sort_column];
return atoi(lp1)-atoi(lp2);
}
else
{
method[sort_column]=1-method[sort_column];
return atoi(lp2)-atoi(lp1);
}
else if(sort_column==2)
if(method[sort_column])
{
method[sort_column]=1-method[sort_column];
return lp1.Compare(lp2);
}
else
{
method[sort_column]=1-method[sort_column];
return lp2.Compare(lp1);
}
return 0;
}
事件响应函数
void CDiagameDlg::OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
sort_column=pNMListView->iSubItem; // 取得需排序的列号
int count=m_listcontrol.GetItemCount();//行数
int i=0;
while(i<3) // 点击第i列后,若method[i]=1时,第i列顺序(逆序)排列,再点击后逆序(顺序)排列,依次循环
{
method[i]=1;
i++;
}
for(i=0;i<count;i++)
m_listcontrol.SetItemData(i,i); // 设置比较关键字
m_listcontrol.SortItems(MyCompareProc,(DWORD_PTR)&m_listcontrol);
*pResult = 0;
}
以上为我写的函数,我的表头有三列,想实现的目的是 点击表头实现一次排序,逆序和顺序交替:可是却实现不了我的效果,现在主要问题有两个:
1,第一列无论如何无法实现排序,自己猜想是和 上贴中 红色代码有关,即第一列和其他列数据的插入方法不一样,应该导致了对应属性的某种差别吧。。
2,其他两列点击后的排序非常奇怪,例如,输入数据为“22 88 11 00 44 88 33”,点击一次后排序为“22 00 88 11 88 33 44”再点击一次后为“11 88 22 44 00 88 33”然后为“44 00 33 22 88 11 88”.。。。。完全不知道这么混乱的原因啊,还有时候会出现 两种序列的交替,但是也不是顺序或者逆序,
求大神指点啊。。。