CMFCListCtrl扩展类排序异常:字符串列非字母序排列
解决CMFCListCtrl字符串列排序异常的问题
我之前也碰到过类似的坑,你的核心问题出在对OnCompareItems函数中lParam1和lParam2参数的理解偏差上——这两个参数不是列表项的索引,而是你为每个项设置的Item Data值(也就是通过SetItemData函数赋值的内容)。
问题原因分析
- 你的第一列排序正常,大概率是因为在添加列表项时,把第一列的整数值直接设置成了对应项的Item Data,所以
lParam1和lParam2刚好是要比较的整数,逻辑自然成立。 - 但第二列你直接用
lParam1作为索引调用GetItemText,这时候如果Item Data不是项的索引,取到的文本根本不是对应项的第二列内容,排序结果自然混乱,而且因为没有越界或者语法错误,所以不会报错。
修复步骤
添加列表项时设置Item Data为项的索引
在你插入每个列表项的代码中,一定要把Item Data设为当前项的索引,这样OnCompareItems里的lParam1和lParam2才能正确对应到项的位置:// 示例:插入列表项并设置Item Data int nItem = InsertItem(LVIF_TEXT, _T("第一列内容")); SetItemText(nItem, 1, _T("第二列字符串")); SetItemData(nItem, nItem); // 关键:将Item Data设为项的索引保留现有
OnCompareItems逻辑即可
你的OnCompareItems代码逻辑本身是正确的,只要Item Data是项的索引,GetItemText(lParam1, iColumn)就能取到对应项对应列的文本,CString::Compare也会按照字母序正确返回比较结果。
额外检查点
- 确认你的列表控件是**报告视图(LVS_REPORT)**模式,这是CMFCListCtrl支持按列排序的前提。
- 如果你需要支持大小写不敏感的字符串排序,可以把
strCol1.Compare(strCol2)改成strCol1.CompareNoCase(strCol2)。
内容的提问来源于stack exchange,提问作者Laza
相关产品推荐
相关产品推荐

