zoukankan      html  css  js  c++  java
  • 再谈VC++中ListControl排序[原创]

      2005.01.05发表于blog.csdn.net/zxub

      昨天做了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);

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

  • 相关阅读:
    【eoe资源】通过片段创建灵活的用户界面
    史上最全的Android开发索引帖
    临时记录
    五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    【转】深入探讨 Android 传感器
    Java Collections Framework Java集合框架List,Map,Set等全面介绍之概要篇
    谷歌 G1 android APK安装器 离线安装软件
    【转】請為你的 Android 程式加上 obfuscation 吧!
    【转】Android Toolchain与Bionic Libc
    用VirtualBox在XP环境下虚拟Ubuntu的过程
  • 原文地址:https://www.cnblogs.com/zxub/p/173843.html
Copyright © 2011-2022 走看看