再谈VC++中ListControl排序[原创]
2005-06-13 21:06
507 查看
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);
这样,就取到了正确的项,后面还要在进行什么操作,这里就不写了,我只说关键部分.
昨天做了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);
这样,就取到了正确的项,后面还要在进行什么操作,这里就不写了,我只说关键部分.
相关文章推荐
- VC++中关于ListControl排序的一点心得[原创]
- VC++中关于ListControl排序的一点心得[原创]
- 再谈VC++中ListControl排序[原创]
- List Control(列表)排序,无需回调函数
- VC List Control控件高级使用
- VC++ List Control 用法
- vc导出listcontrol界面值到excel最简单的例子
- VC++ List Control 的具体用法实例。
- VC++ List Control 的具体用法实例。
- ListControl 点击列头排序 详解
- VC 6.0 MFC ListControl 控件的使用
- Vc++ 控件List Control用法总结
- Vc List control Custom Draw
- VC控件ListControl的使用
- 【原创】Java 对 List 内对象根据对象属性进行排序
- VC List Control 用法及技巧 总结1
- VC++ List Control的操作(添加、删除、颜色等)
- Vc控件用法总结之List Control
- VC++中ClistControl列表头实现排序
- VC++ List Control 的具体用法实例