C++ 排序CMFCListCtrl时的奇怪行为
我扩展了C++ 排序CMFCListCtrl时的奇怪行为,c++,mfc,C++,Mfc,我扩展了CMFCListCtrl类,主要是为了能够方便地按列排序。据我所知,实现Sort和OnCompareItems函数就足够了 所发生的事情是,排序对类型为integer的第1列很有效,但对类型为string的第2列给出了奇怪的排序。没有错误,顺序已更改,但不按字母顺序排列 int MyCMFCListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn) { if (iColumn == 0) {
CMFCListCtrl
类,主要是为了能够方便地按列排序。据我所知,实现Sort
和OnCompareItems
函数就足够了
所发生的事情是,排序对类型为integer
的第1列很有效,但对类型为string
的第2列给出了奇怪的排序。没有错误,顺序已更改,但不按字母顺序排列
int MyCMFCListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
if (iColumn == 0)
{
if (lParam1 > lParam2)
return -1;
else if (lParam1 < lParam2)
return 1;
else
return 0;
}
else if (iColumn == 1)
{
CString strCol1, strCol2;
strCol1 = GetItemText(lParam1, iColumn);
strCol2 = GetItemText(lParam2, iColumn);
return strCol1.Compare(strCol2);
}
return 0;
}
void MyCMFCListCtrl::Sort(int iColumn, BOOL bAscending, BOOL bAdd)
{
// Sort available for first and second column
if (iColumn > 1) return;
CMFCListCtrl::Sort(iColumn, bAscending, bAdd);
}
int-MyCMFCListCtrl::OnCompareItems(lparamlparam1,lparamlparam2,int-iColumn)
{
如果(iColumn==0)
{
如果(lParam1>lParam2)
返回-1;
else if(lParam11)返回;
CMFCListCtrl::Sort(iColumn、bAscending、bAdd);
}
我在
OnCompareItems
中得到的值对于这两列都可以。但最终结果只对第一个有效。是否还有其他必要的功能可以使用?CMFCListCtrl::Sort
将调用CListCtrl::SortItems
SortItems
将LPARAM
项数据传递给回调函数。此LPARAM
是一个可以使用SetItemData
设置的值
这意味着OnCompareItems
中的lParam1
和lParam2
,仅参考LPARAM
数据
GetItemText(lParam1,iColumn)
在本例中是未定义的行为,因为lParam1
不引用行号
另请参见和的文档
您可以替代
Sort
并调用SortItemsEx
。这样,lParam1
和lParam2
将引用行号,GetItemText(lParam1,iColumn)
将是一个有效的调用,如下所示。请注意,(iColumn==0)
条件仅在前面调用了SetItemData
时使用
int MyCMFCListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
if(iColumn == 0)//assuming SetItemData was called earlier
return lParam1 - lParam2;
CString strCol1 = GetItemText(lParam1, iColumn);
CString strCol2 = GetItemText(lParam2, iColumn);
return strCol1.Compare(strCol2);
}
void MyCMFCListCtrl::Sort(int iColumn, BOOL bAscending, BOOL bAdd)
{
if(iColumn == 0)//assuming SetItemData was called earlier
{
//call SortItem and get LPARAM data in call back function
CMFCListCtrl::Sort(iColumn, bAscending, bAdd);
return;
}
//call SortItemEx instead, get row numbers in callback function
CWaitCursor wait;
GetHeaderCtrl().SetSortColumn(iColumn, bAscending, bAdd);
m_iSortedColumn = iColumn;
m_bAscending = bAscending;
SortItemsEx(CompareProc, (LPARAM)this);
}
“但它给出了无效的顺序”:这是什么意思?在某些地方是否有错误消息?程序崩溃了吗?这是一个断言吗?请回答您的问题并更加具体。还要检查
strCol1
和strCol2
是否包含正确的字符串。放置跟踪(“OnCompareItems:%s%s\n”,strCol1,strCol2)代码>右前<代码>返回strCol1.比较(strCol2)
并检查调试输出。是否有其他必要的功能使其工作?--我们不知道你的实际数据是什么。所以现在我们不能假设排序“不起作用”。是否可以简单地使用(SetSortColumn
)函数?这是否回答了您的问题?