我在使用 CListView 时不知道里面的项怎么排序,望高手指教,或提供一些资料。小生谢过了。

解决方案 »

  1.   

    http://www.vchelp.net/vchelp/zart/sortl.asp?type_id=9&class_id=1&cata_id=1&article_id=73
      

  2.   

    请参考下例,已涉及字符串、整数、日期的升降排序,你可根据需要增加修改。/////////////////////////////////////////////////////////////////////////////
    // callback for sort
    int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param);// 响应 LVN_COLUMNCLICK
    void CMyListView::OnHeaderClick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    *pResult = 0;
    NM_LISTVIEW* pnmlv = (NM_LISTVIEW*)pNMHDR; int nItems = GetListCtrl().GetItemCount();
    if(nItems < 2) return; if(pnmlv->iSubItem != m_iSortColumn)
    {
    m_bAscend = TRUE;
    m_iSortColumn = pnmlv->iSubItem; for(int i=0; i < nItems; i++)
    {
    TCHAR *pOldBuf = (TCHAR *)m_ListFilePath.GetItemData(i);
    if(pOldBuf)
    delete pOldBuf; CString strText = m_ListFilePath.GetItemText(i, pnmlv->iSubItem); TCHAR *buf = new TCHAR[strText.GetLength()+1];
    lstrcpy(buf, strText); GetListCtrl().SetItemData(i, (DWORD)buf);
    }
    }
    else
    {
    m_bAscend = !m_bAscend;
    } GetListCtrl().SortItems(CompareListItem, (DWORD)this);
    }int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param)
    {
    CPlayListDlg *pDlg = (CPlayListDlg *)param;
    int iCol = pDlg->m_iSortColumn;
    int ret = 0;
    CString str1((TCHAR *)lParam1);
    CString str2((TCHAR *)lParam2); switch(iCol)// 每列使用不同的排序方法,根据需要修改。
    {
    case 0: // string
    ret = str1.CompareNoCase(str2);
    break;
    case 1: // int
    ret = atoi(str1) - atoi(str2);
    break;
    case 2: // date
    {
    char c;
    int y1, m1, d1, hour1, min1, sec1;
    int y2, m2, d2, hour2, min2, sec2;// sscanf(str1,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d", 
    // &y1, &c,&c, &m1, &c,&c, &d1, &c,&c,  &hour1, &c,&c, &min1, &c,&c, &sec1);
    // sscanf(str2,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d", 
    // &y2, &c,&c, &m2, &c,&c, &d2, &c,&c,  &hour2, &c,&c, &min2, &c,&c, &sec2); sscanf(str1,"%d%c%d%c%d%c%d%c%d%c%d", 
    &y1, &c, &m1, &c, &d1, &c,  &hour1, &c, &min1, &c, &sec1);
    sscanf(str2,"%d%c%d%c%d%c%d%c%d%c%d", 
    &y2, &c, &m2, &c, &d2, &c,  &hour2, &c, &min2, &c, &sec2); CTime time1(y1, m1, d1, hour1, min1, sec1);
    CTime time2(y2, m2, d2, hour2, min2, sec2); CTimeSpan span = time1 - time2; ret = span.GetSeconds();
    }
    break;
    } if(! pDlg->m_bAscend)
    ret = -ret; return ret;
    }void CPlayListDlg::OnDeleteitemList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NMLISTVIEW *pnmlv = (NMLISTVIEW *)pNMHDR; if(pnmlv->lParam)
    {
    delete (TCHAR *)pnmlv->lParam;
    pnmlv->lParam = 0;
    }
    }
      

  3.   

    上例已经很详细了,还可以参考programing windows with MFC里关于CListView排序的的部分说明,更容易看懂