问题是在排序时要取出lparam1和lparam2来比较,但我取出来的是空的,不懂为什么?CTest2Dlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; m_list.SortItems(compareFunction,DWORD(this));//m_list已经与listcontrol控件绑定。 *pResult = 0;
}int CALLBACK CTest2Dlg::compareFunction(LPARAM lparam1,LPARAM lparam2,LPARAM lparamSort)
{

CListCtrl * pListCtrl = reinterpret_cast<CListCtrl*>(lparamSort);
CString lp1 = pListCtrl->GetItemText(lparam1,0);//lp1是空的
CString lp2 = pListCtrl->GetItemText(lparam2,0);//lp2也是空的


AfxMessageBox(lp1);//还是空的
return strcmp(lp2,lp1);
}

解决方案 »

  1.   

    在SortItems之前要对tiem进行设置,即SetItemData,也就是compareFunction(LPARAM lparam1,LPARAM lparam2,LPARAM lparamSort) 
    中lparam1和lparam2的值。
      

  2.   

    MSDN:
    The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.LPARAM lparam1,LPARAM lparam2 是Item的 Data, 不是索引(Index)需要对每个Item调用  CListCtrl::SetItemData 才有值
      

  3.   

    你有为每一个item设置数据了吗?
    CListCtrl::SetItemData
      

  4.   

    谁告诉你lParam参数就是项目索引?
      

  5.   

    The lParam1 parameter is the 32-bit value associated with the first item being compared, and the lParam2 parameter is the value associated with the second item. These are the values that were specified in the lParam member of the items' LVITEM structure when they were inserted into the list. The lParamSort parameter is the same as the dwData value.
      

  6.   

    看你给Item的lParam是怎么设置的,可以在InsertItem的时候指定,也可以添加Item之后再SetItemData,如果设置的索引值才能用GetItemText来取文字。
      

  7.   

    左参和右参中存放的应该是LPITEMINFO的解构体,不是索引哦.
      

  8.   

    我在InsertItem时指定了啊,不过没贴出来而已
    void CTest2Dlg::OnButton2() 
    {
             m_list.InsertItem(0,"raven");
    m_list.SetItemText(0,1,"boy");
    m_list.SetItemText(0,2,"18"); m_list.InsertItem(1,"candy");
    m_list.SetItemText(1,1,"girl");
    m_list.SetItemText(1,2,"17"); m_list.InsertItem(2,"jack");
    m_list.SetItemText(2,1,"boy");
    m_list.SetItemText(2,2,"21"); m_list.InsertItem(3,"kary");
    m_list.SetItemText(3,1,"girl");
    m_list.SetItemText(3,2,"19");
    }
      

  9.   

            m_list.InsertItem(0,"raven"); 
    m_list.SetItemText(0,1,"boy"); 
    m_list.SetItemText(0,2,"18"); 
    m_list.SetItemData(0, 0);m_list.InsertItem(1,"candy"); 
    m_list.SetItemText(1,1,"girl"); 
    m_list.SetItemText(1,2,"17"); 
    m_list.SetItemData(1, 1);m_list.InsertItem(2,"jack"); 
    m_list.SetItemText(2,1,"boy"); 
    m_list.SetItemText(2,2,"21"); 
    m_list.SetItemData(2, 2);m_list.InsertItem(3,"kary"); 
    m_list.SetItemText(3,1,"girl"); 
    m_list.SetItemText(3,2,"19"); 
    m_list.SetItemData(3, 3);
      

  10.   

    如果要在InsertItem时指定,需要用:
    int InsertItem(const LVITEM* pItem);
    用下面这个是没法指定的:
    int InsertItem(int nItem, LPCTSTR lpszItem);
    也可以参考LS的做法。
      

  11.   

    用了zhoujianhei兄的方法,还是空值苦恼
      

  12.   

    设置断点调试看看compareFunction函数中lparam1、lparam2的值是多少。
      

  13.   

    m_list.SortItems(compareFunction,DWORD(this));
    这行错了,改成:
    m_list.SortItems(compareFunction,(DWORD_PTR)&m_list);
      

  14.   

    http://blog.csdn.net/precipitant/archive/2006/09/20/1254878.aspx
      

  15.   

    对!就是这句错了:m_list.SortItems(compareFunction,DWORD(this)); 谢谢cnzdgs,谢谢各位!