list control排序问题

这些时候研究ListControl的排序,真是头都要大了,我的情况是在一个 dialog上放了多个ListControl,要在点击其中一个的一列的时候进行排序,在网上找了好多资料,讲得都不是很清楚,现在想来,不是没讲到要点,就是讲得太不清楚,让人云里雾里的,真是郁闷啊,讲清楚了的就没一个!!都是缺这少那的,走了不少错路,唉~~~ 
      ListControl排序,是要靠参数项(LVIF_PARAM)的,回调函数进行比较,靠的就是它。这一点,我在问专家网上看到了,问题是象我这种初用VC++的人,怎么知道在哪里加那么个参数呢?找了好多地方,终于知道了:
  LV_ITEM lvitem; 
        lvitem.mask=LVIF_PARAM; 
        lvitem.iItem=i;//i是一个数字,索引用的,自己定义 
        lvitem.lParam=i; 
        m_List_StaResult.SetItem(&lvitem); 
       上面的内容,要在往ListControl加项目的时候加上去,而且每个都要加的。 
       上面的知道了,好,轮到回调函数了。回调函数,主要问题是没有this指针用了,又要和当前对话框联系了,我找了下,有2种方法,一是把回调函数定义成友员函数,我没有成功,郁闷,定义成静态成员函数后,有种方法说用个全局指针指向当前对话框,我试着在头文件里定义一下,老说已经定义了,郁闷,试啊试,在 cpp文件里定义下,居然ok了,唉~~好了,在初始函数里加上那么一句:g_dlg=this;这下在回调函数里调用一下,OK了....... 
回调函数的内容如下:

int CALLBACK CStaMDiag::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 

     CString strItem1=g_dlg->m_List_StaResult.GetItemText((int)lParam1,(int)lParamSort); 
     CString strItem2=g_dlg->m_List_StaResult.GetItemText((int)lParam2,(int)lParamSort); 
     int r1=atoi(strItem1); 
     int r2=atoi(strItem2); 
     if (r1==r2) 
         return 0; 
     else 
     { 
        if (r1>r2) 
            return -1; 
        else

            return 1; 
     }  

看看就知道3个参数的意思了,唉~~折腾了这么些时候终于好了。 
鉴于初用VC++,老鸟看了多批评指正,谢谢!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zxub/archive/2005/01/04/239973.aspx

      昨天做了ListControl中的排序功能,但是使用后,发现只有在第一次数据完全没排序的时候,排序才是正确的,仔细看了下排序用到的回调函数: 
int CALLBACK CStaMDiag::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 

CString strItem1=g_dlg->m_List_StaResult.GetItemText((int)lParam1,(int)lParamSort); 
CString strItem2=g_dlg->m_List_StaResult.GetItemText((int)lParam2,(int)lParamSort); 
int r1=atoi(strItem1); 
int r2=atoi(strItem2); 
if (r1==r2) 
  return 0; 
else 

  if (r1>r2) 
   return -1; 
  else return 1; 
}  

终于发现了问题所在,假设一开始的时候,lParam参数的排列是0,1,2,3,4,5,开始排序的时候,g_dlg->m_List_StaResult.GetItemText((int)lParam,(int)lParamSort)中,若要取第二个项目,正好是(1,lParamSort),但是,排序后,根据上面的算法,取第二个项目的时候,由于lParam参数的排列可能是 0,3,2,1,4,5,结果,就会取错项目,从而导致排序的时候乱取项目来排,当然不准了,所以CString strItem1=g_dlg->m_List_StaResult.GetItemText((int)lParam1, (int)lParamSort)这种取法是错误的,所以,不能用lParam参数来表示数据所在的行了.既然可以传个lParam参数进来,那程序肯定是知道要取哪个项的,所以我们要做的是通过lParam正确得到项目中的数据,找了一下相关资料,结果如下: 
CString strItem1, strItem2; 
LVFINDINFO info; 
    int nIndex; 
    info.flags=LVFI_PARAM; 
info.lParam=lParam1; 
if ( (nIndex=g_dlg->m_List_StaResult.FindItem(&info))!=-1) 
        strItem1=g_dlg->m_List_StaResult.GetItemText(nIndex,(int)lParamSort); 
info.lParam=lParam2; 
if ( (nIndex=g_dlg->m_List_StaResult.FindItem(&info))!=-1) 
        strItem2=g_dlg->m_List_StaResult.GetItemText(nIndex,(int)lParamSort);

这样,就取到了正确的项,后面还要在进行什么操作,这里就不写了,我只说关键部分.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zxub/archive/2005/01/05/240255.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值