VC中CListCtrl排序
来源:互联网 发布:黑产数据买卖网站 编辑:程序博客网 时间:2024/05/18 00:22
VC中CListCtrl排序
编号: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);
}
}
四、创建CListCtrl的LVN_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非常重要,如果没有本行代码排序将出问题。
- VC中CListCtrl排序
- 【转帖】VC中使CListCTrl控件排序
- 使用VC中CListCtrl的SortItems对数据排序.txt
- 使用VC中CListCtrl的SortItems对数据排序
- vc 中CListCtrl的使用方法
- VC中CListCtrl使用技巧
- VC中CListCtrl用法详解
- VC中CListCtrl使用技巧
- 37.VC(custom)-CListCTrl控件排序
- CListCtrl中排序的问题
- VC中如何隐藏CListCtrl的表头
- vc中CListCtrl控件点击修改数据
- VC中为clistctrl右键弹出菜单
- VC/MFC中 CListCtrl控件的使用方法
- VC++中可编辑的CListCtrl实现
- vc Clistctrl中如何添加图片
- VC中为clistctrl右键弹出菜单
- VC中为clistctrl右键弹出菜单
- CComboBox中使用附加数据
- LTE PRACH (1)
- 几种排序算法
- 本人见过的最有用的日志!不来转藏肯定后悔
- linux下编译 出现 cc1: warnings being treated as errors
- VC中CListCtrl排序
- Android TTS学习——继续爱的表白
- SQL存储过程入门学习
- C程序注意问题
- VC中如何给对话框加背景图片
- 信息安全等级保护相关标准体系(合集)
- struts2 表单不能自动填充的可能原因
- 深入研究Asp.net页面的生命周期
- 感冒--感想