Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 排序CMFCListCtrl时的奇怪行为_C++_Mfc - Fatal编程技术网

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
)函数?这是否回答了您的问题?