+ -
当前位置:首页 → 问答吧 → CListCtrl排序问题

CListCtrl排序问题

时间:2011-12-14

来源:互联网

int CListCtrlDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int row1=(int)lParam1;
int row2=(int)lParam2;
CListCtrl *lc=(CListCtrl*)lParamSort;
CString lp1=lc->GetItemText(row1,sort_column);
CString lp2=lc->GetItemText(row2,sort_column);
if(sort_column<2)
{
if(method)

{
method=FALSE;
return strcmp((char*)(LPCTSTR)lp1,(char*)(LPCTSTR)lp2);
}
else
{
method=TRUE;
return strcmp((char*)(LPCTSTR)lp1,(char*)(LPCTSTR)lp2);
}
}
return 0;
}

为什么只是排序前2项,觉得if中应该来个循环,我想全部排序,应该怎么做,求解?

作者: tixisong   发布时间: 2011-12-14

C/C++ code
void CClistSortDlg::ListSort(void)
{
    int listcount = m_list.GetItemCount(); 
    int nColumn =m_list.GetHeaderCtrl()->GetItemCount();
    CString temp0,temp1,temp2; 
    for(int j = 1;j <listcount;j++) 
    { 
        for(int i=0;i <listcount-j;i++) 
        { 
            temp1 = m_list.GetItemText(i,0); //m_list为控件绑定的变量,根据自己的修改
            temp2 = m_list.GetItemText(i+1,0); 
            //int nRe = StrCmpLogicalW(temp1,temp2); //
            int nRe = StrCmpI(temp1,temp2);            //    
            if (m_bSort)
            {
                if (nRe < 0)
                {
                    for(int n=0;n <nColumn;n++) 
                    { 
                        temp1 = m_list.GetItemText(i,n); 
                        temp2 = m_list.GetItemText(i+1,n); 
                        m_list.SetItemText(i,n,temp2); 
                        m_list.SetItemText(i+1,n,temp1); 
                    }
                }
            }                
            if (!m_bSort)
            {
                if (nRe > 0)
                {
                    for(int n=0;n <nColumn;n++) 
                    { 
                        temp1 = m_list.GetItemText(i,n); 
                        temp2 = m_list.GetItemText(i+1,n); 
                        m_list.SetItemText(i,n,temp2); 
                        m_list.SetItemText(i+1,n,temp1); 
                    } 
                }
            }
        }
    }
}

作者: shen_wei   发布时间: 2011-12-14

引用 1 楼 shen_wei 的回复:
C/C++ code
void CClistSortDlg::ListSort(void)
{
int listcount = m_list.GetItemCount();
int nColumn =m_list.GetHeaderCtrl()->GetItemCount();
CString temp0,temp1,temp2;
for(int j……


有没有简单一点的?

作者: tixisong   发布时间: 2011-12-15

代码复制了就能使用了。。

o(︶︿︶)o 唉。

作者: shen_wei   发布时间: 2011-12-15

MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
这个函数如果是CListCtrl用来排序的回调函数,这样写是对的。
CListCtrl会针对每行记录调用这个函数来排序。不是用来你自己在对话框中调用的。得加上这个
C/C++ code

void CListCtrlDlg::OnColumnClickDGrid(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;

    m_lstctlTable.SortItems((PFNLVCOMPARE)MyCompareProc, &m_lstctlTable);
    *pResult=0;
}


然后点击列表头,就对其中记录按MyCompareProc中的规则,排序了。

作者: ddszhan   发布时间: 2011-12-15

热门下载

更多