网络上关于listctrl排序问题大都没提到在listview上排序的
我在listview上响应LVN_COLUMNCLICK,写完了回调函数,然后按f10 调试,结果在
viewcore.cpp文件的下列函数的第二个return处出错
BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
// first pump through pane
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; // then pump through document
if (m_pDocument != NULL)
{
// special state for saving view before routing to document
CPushRoutingView push(this);
return m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
} return FALSE;
}我的排序代码如下:
struct List_Data{
CString logTime;
CString logContent;
CString logStatus;
}ElogData[50000];//定义回调函数
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)//第三个参数为list 对象指针
{
CSortList* pV=(CSortList*)lParamSort;//获取当前对象的指针 /*if((lParamSort == 0) || (pV == NULL)) 

if (lParam1 > lParam2) 
return pV->m_Revert*-1; 
else 
return pV->m_Revert; 
}*/ List_Data* pInfo1=ElogData+lParam1;//比较两项
List_Data* pInfo2=ElogData+lParam2;
int iCompRes;
if(pV->m_nSortedCol==1)
{
if(pInfo1->logContent == pInfo2->logContent)
iCompRes = 0;
else
iCompRes=(pInfo1->logContent < pInfo2->logContent)?-1:1;
}
else
return 0;
//根据当前的排序方式进行调整
if(pV->m_fAsc)
return iCompRes;
else
return iCompRes*-1;
}
void CServerElogView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CSortList& uList = (CSortList&)GetListCtrl();  
if( pNMListView->iSubItem == uList.m_nSortedCol )//根据点击的列索引来判断,这一次点击的列与上一次点击的列是否相等,不相等则重新排列不规则序,相等,则以上一次的相反顺序排序
{
uList.m_fAsc = !uList.m_fAsc;
}
else
{
uList.m_fAsc = TRUE;//告诉系统当前为顺序,下次排成倒序
uList.m_nSortedCol = pNMListView->iSubItem;//保存这一次点击的列值
}
m_ctlHeader.SetSortArrow( uList.m_nSortedCol, uList.m_fAsc ); uList.SortItems(ListCompare, (DWORD)&uList);  

*pResult = 0;
}
注:CSortList 是CListCtrl的子类
大侠耐心看看这段简单的代码,问题解决就给分

解决方案 »

  1.   

    看完了,没发现什么问题,不知道下面的语句会不会产生问题:
    List_Data* pInfo1=ElogData+lParam1;//比较两项
    List_Data* pInfo2=ElogData+lParam2;
    我记得,我原来使用这种结构指针的时候,有一种情况下(具体什么情况我还不是很确定),不能简单写成List_Data,而必须写成:
    struct List_Data* pInfo1 = ElogData+lParam1;
    struct List_Data* pInfo2 = ElogData+lParam2;
    我的习惯是定义结构的时候使用typedef:
    typedef struct tagList_Data
    {
        ...
    }List_Data, *PList_Data;
    List_Data ElogData[5000];
    你可以像上面的改动一样,修改一下,看看问题是否依然存在,如果还村在,呵呵,那你还需要努力。
      

  2.   

    我的写法是照着一些非listview(如dlg)的实例写的,这么使用结构体应该没问题