VC中CListCtrl排序

来源:互联网 发布:黑产数据买卖网站 编辑:程序博客网 时间:2024/05/18 00:22

 

VCCListCtrl排序

 

编号:A3GS_TV20100113001

 

描述:

 

本文以实例代码的形式讲述了在VC中实现CListCtrl的排序。

 

例子

 

请下载文本例子代码

 

技术实现:

 

一、声明一个用于排序用的结构体,如下:

    typedef struct tag_ListSortNode

{

          CListCtrl* pList;

          int nOrder;

          int nColum;

}LISTSORTNODE,*PLISTSORTNODE;

二、创建一个保存排序列信息的数组,如下:

    LISTSORTNODE m_tSortColumns[3];

三、创建一个排序比较的回调函数,如下:

    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

{

          PLISTSORTNODE pItem =(PLISTSORTNODE)lParamSort;

          CListCtrl*   list  =pItem->pList;

          int          isub  =pItem->nColum;

 

          LVFINDINFO findInfo;

          findInfo.flags  = LVFI_PARAM;

 

          findInfo.lParam = lParam1;

          int iItem1      = list->FindItem(&findInfo, -1);

 

          findInfo.lParam = lParam2;

          int iItem2      = list->FindItem(&findInfo, -1);

 

          CString strItem1 =list->GetItemText(iItem1,isub);

          CString strItem2 =list->GetItemText(iItem2,isub);

          //判断是否比较列是否为数值

          if ( isub == 2 )

          {

              int nNum1 = atoi( strItem1 );

              int nNum2 = atoi( strItem2 );

              if(pItem->nOrder == 0)

                   return nNum1>nNum2 ? 1 : -1;

              else

                   return nNum1>nNum2 ? -1 : 1;

          }else

          {

               if(pItem->nOrder == 0)

                   return strcmp(strItem2, strItem1);

              else

                   return -strcmp(strItem2, strItem1);

          }

}

四、创建CListCtrlLVN_COLUMNCLICK事件处理函数,如下:

    void CListCtrlSortDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

          NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

          // TODO: Add your control notification handler code here

          //获取列的排序数据

          PLISTSORTNODE pItem = &m_tSortColumns[pNMListView->iSubItem];

          pItem->pList        = &m_rList;

          pItem->nColum       = pNMListView->iSubItem;

          if ( pItem->nOrder == 0 )

          {

              pItem->nOrder = 1;

          }else

          {

              pItem->nOrder = 0;

          }

          m_rList.SortItems(MyCompareProc,(LPARAM)pItem);

    

          *pResult = 0;

}

五、添加测试数据,如下:

//设置ListCtrl

m_rList.SetExtendedStyle( LVS_EX_FULLROWSELECT );

m_rList.InsertColumn( 0, _T("网址"), LVCFMT_LEFT, 300 );

m_rList.InsertColumn( 1, _T("说明"), LVCFMT_LEFT, 230 );

m_rList.InsertColumn( 3, _T("耗时"), LVCFMT_LEFT, 80 );

 

//添加ListCtrl数据

int nRet;

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/index.asp") );

//设置一个唯一的Item数据,否则无法排序

m_rList.SetItemData( nRet, 0 );

m_rList.SetItemText( nRet, 1, _T("天使知识授理厂") );

m_rList.SetItemText( nRet, 2, _T("100") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/Info_More.asp?classID=789") );

m_rList.SetItemData( nRet, 1 );

m_rList.SetItemText( nRet, 1, _T("Android") );

m_rList.SetItemText( nRet, 2, _T("20") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/Info_More.asp?classID=645") );

m_rList.SetItemData( nRet, 2 );

m_rList.SetItemText( nRet, 1, _T("Windows Mobile") );

m_rList.SetItemText( nRet, 2, _T("300") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/Info_More.asp?classID=643") );

m_rList.SetItemData( nRet, 3 );

m_rList.SetItemText( nRet, 1, _T("iPhone") );

m_rList.SetItemText( nRet, 2, _T("99") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/Info_More.asp?classID=644") );

m_rList.SetItemData( nRet, 4 );

m_rList.SetItemText( nRet, 1, _T("Symbian") );

m_rList.SetItemText( nRet, 2, _T("20") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/Info_More.asp?ClassID=799") );

m_rList.SetItemData( nRet, 5 );

m_rList.SetItemText( nRet, 1, _T("嵌入式") );

m_rList.SetItemText( nRet, 2, _T("111") );

 

nRet = m_rList.InsertItem( m_rList.GetItemCount( ), _T("http://www.a3gs.com/About.asp") );

m_rList.SetItemData( nRet, 6 );

m_rList.SetItemText( nRet, 1, _T("关于我们") );

m_rList.SetItemText( nRet, 2, _T("222") );

:上面的SetItemData非常重要,如果没有本行代码排序将出问题。

原创粉丝点击