关于ListCtrl SortItem 和 SetItemData的问题

chenchenyangll 2010-05-23 06:04:45
看了网上很多帖子, 在排序前一定要使用SetItemData,不然只有第一次排序能得出正确结果,再之后的排序就不对

那有什么办法不用SetItemData就能完成排序? 即 保持每个项的ItemData
...全文
465 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingkingking 2012-05-17
  • 打赏
  • 举报
回复
还是有点不知道
chenchenyangll 2010-06-22
  • 打赏
  • 举报
回复
我就是用1L和4L的方法来保存有用数据的,虽然麻烦点但是没办法
排序前必须要SetItemData,负责默认每个ItemData均为0,调用回调函数时,lParam1 和 lParam2 的值都是0,不能完成排序操作

另外问一个:在VS2010环境下,怎样使用CMFCListCtrl类的排序方法? 我通过类向导继承了这个类,但是没有发现他的重载函数OnCompareItems
finder_zhang 2010-05-31
  • 打赏
  • 举报
回复
刚才查了一下,试了一下代码,原来 SetItemData() 的时候,所设的值,就是 lParam 的值.

m_List.InsertItem(0,"abc",0);
m_List.SetItemData(0,0x30);
LVITEM lvi;
lvi.iItem = 0;
m_List.GetItem(&lvi);

试了一下这个代码,把SetItemData 传 0x30 进去,然后再读出 LVITEM ,然后发现lParam = 0x30
怪不得看到有人说用SetItemData来设排序的参数,原来SetItemData与设这个lParam 是一样的.
finder_zhang 2010-05-29
  • 打赏
  • 举报
回复
想学一下SetItemData 是怎么排的?
楼主有没有代码发一下,学习一下.
finder_zhang 2010-05-29
  • 打赏
  • 举报
回复
楼主,这个 CListCtrl 的排序我是跟着MSDN学的,没用过 SetItemData 这个,但我可以排序.
MSDN上面说,LVITEM 里面有个成员,叫 lParam 的.只要设好这个值,以后就可以排了.

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);
这个自定义的,用于排序的回调函数,那2个参数lPaaram1,2 就是我们每一个Item的 lParam 的内容.

只要我们在建每一个Item 时都设好 lParam 的内容,就行了.
arong1234 2010-05-28
  • 打赏
  • 举报
回复
而且对于同样的数据数组,如果里面的数据不变,它本来就应该每次排序都一样,不明白为什么你觉得它每次排序就需要不一样

注意你不是比较item data,而是应该比较item data所代表的data,也就是那个数组的内容,这才是list的排序需要做的[Quote=引用 4 楼 arong1234 的回复:]
你每次sort完后,把数组也排序一下,然后用SetItemData再把data指向新的下标即可


引用 3 楼 chenchenyangll 的回复:
引用 1 楼 arong1234 的回复:
我存的是我的数据在数组中的下标。所以一旦SetItemData那么数据就不能方便的获得了
[/Quote]
arong1234 2010-05-28
  • 打赏
  • 举报
回复
你每次sort完后,把数组也排序一下,然后用SetItemData再把data指向新的下标即可

[Quote=引用 3 楼 chenchenyangll 的回复:]
引用 1 楼 arong1234 的回复:
我存的是我的数据在数组中的下标。所以一旦SetItemData那么数据就不能方便的获得了
[/Quote]
chenchenyangll 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
因为比较函数里使用元素得Data值作为参数,因此你完全不涉及data是不可能得。你必须有办法根据data值找到两个待比较得元素,你不setitemdata,系统怎么进行比较?不进行比较,又怎么进行排序呢?

一般情况下,我从来不在Data部分保存有用得数据,我一般会另外创建一个数据结构(如CArray对象)保存有用数据,然后把list得元素得data设置为这个array里对应元素得下标。因此我……
[/Quote]

我存的是我的数据在数组中的下标。所以一旦SetItemData那么数据就不能方便的获得了
vcrun 2010-05-23
  • 打赏
  • 举报
回复
       // Initialize LVITEM members that are common to all items.
LVITEM lvI;
lvI.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE;
lvI.iSubItem = 0;
lvI.state = 0;
lvI.stateMask = 0;
lvI.pszText = LPSTR_TEXTCALLBACK; // sends an LVN_GETDISPINFO message

// Initialize LVITEM members that are different for each item.
for (int index = 0; index < cItems; index++)
{
lvI.iItem = index;
lvI.iImage = index;
lvI.lParam = ????;

// Insert items into the list.
if (InsertItem(&lvI) == -1)
return FALSE;
}

arong1234 2010-05-23
  • 打赏
  • 举报
回复
因为比较函数里使用元素得Data值作为参数,因此你完全不涉及data是不可能得。你必须有办法根据data值找到两个待比较得元素,你不setitemdata,系统怎么进行比较?不进行比较,又怎么进行排序呢?

一般情况下,我从来不在Data部分保存有用得数据,我一般会另外创建一个数据结构(如CArray对象)保存有用数据,然后把list得元素得data设置为这个array里对应元素得下标。因此我们可以根据item data找到你所需要得数据。这样你就不必担心每次SetItemData把有用得值冲掉了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧