CListCtrl中排序的问题

总结两种方法实现排序:第一种通过CListCtrl的SortItems方法实现(推荐);第二种方法是我用STL 的MAP实现的。

第一种方法:

void CLogManage::OnLvnColumnclickListLog(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
sort_column = pNMLV->iSubItem;//点击的列
int count = m_list_log.GetItemCount();
for (int i=0;i<count;i++)
m_list_log.SetItemData(i,i); // 每行的比较关键字,此处为列序号(点击的列号),可以设置为其他比较函数的第一二个参数
m_list_log.SortItems(MyCompareProc,(DWORD_PTR)&m_list_log);//排序 第二个参数是比较函数的第三个参数
method=!method;
*pResult = 0;
}


static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// 从参数中提取所需比较lc的两行数据
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 == 0)
{
//转换时间
COleDateTime t1,t2;
t1.ParseDateTime(lp1);
t2.ParseDateTime(lp2);
if(method)
return t1>t2;
else
return t2>t1;
}


//比较
if(method)
return lp1>lp2;
else
return lp1<lp2;


return 0;
}



第二种方法:



void CLogManage::OnHdnItemclickListLog(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
int count=m_list_log.GetItemCount();
if(0==count)
{
*pResult = 0;
return;
}
int m_iCurSortedColumn =phdr->iItem;
if (m_iCurSortedColumn == 0)
{
if (sort)
{
sort_min(count);
}
else
{
sort_max(count);
}
sort = !sort;
}


*pResult = 0;
}
void CLogManage::sort_min(int num)
{
vector<CString> Datalist[6];//存储数据
multimap<time_t,int> indexTable;//存储排序列
for (int row = 0;row < num;row++)
{
//转换时间
tm tm_Temp;
time_t time_Ret;
CString AFormat="%d/%d/%d %d:%d:%d";
CString strtime = m_list_log.GetItemText(row,0);
sscanf(strtime,AFormat,
&(tm_Temp.tm_year),   
&(tm_Temp.tm_mon),   
&(tm_Temp.tm_mday),  
&(tm_Temp.tm_hour),  
&(tm_Temp.tm_min),  
&(tm_Temp.tm_sec));
tm_Temp.tm_year -= 1900;  
tm_Temp.tm_wday=0;  
tm_Temp.tm_yday=0;  
tm_Temp.tm_isdst = 0;
time_Ret = mktime(&tm_Temp);
indexTable.insert(pair<time_t,int>(time_Ret,row));
Datalist[0].push_back(strtime);
for (int col=1;col<6;col++)
{
CString strIterm = m_list_log.GetItemText(row,col);
Datalist[col].push_back(strIterm);
}
}
//清空所有数据
int index = 0;
m_list_log.DeleteAllItems();
multimap<time_t,int>::reverse_iterator riter;
for(riter=indexTable.rend();riter!=indexTable.rbegin();index++)
{
riter--;
int i=riter->second;
m_list_log.InsertItem(index,"");
for(int j=0;j<6;j++)
{
m_list_log.SetItemText(index,j,Datalist[j][i]);
}
}


}
void CLogManage::sort_max(int num)
{
vector<CString> Datalist[6];//存储数据
multimap<time_t,int> indexTable;//存储排序列
for (int row = 0;row < num;row++)
{
//转换时间
tm tm_Temp;
time_t time_Ret;
CString AFormat="%d/%d/%d %d:%d:%d";
CString strtime = m_list_log.GetItemText(row,0);
sscanf(strtime,AFormat,
&(tm_Temp.tm_year),   
&(tm_Temp.tm_mon),   
&(tm_Temp.tm_mday),  
&(tm_Temp.tm_hour),  
&(tm_Temp.tm_min),  
&(tm_Temp.tm_sec));
tm_Temp.tm_year -= 1900;  
tm_Temp.tm_wday=0;  
tm_Temp.tm_yday=0;  
tm_Temp.tm_isdst = 0;
time_Ret = mktime(&tm_Temp);
indexTable.insert(pair<time_t,int>(time_Ret,row));
Datalist[0].push_back(strtime);
for (int col=1;col<6;col++)
{
CString strIterm = m_list_log.GetItemText(row,col);
Datalist[col].push_back(strIterm);
}
}
//清空所有数据
int index = 0;
m_list_log.DeleteAllItems();
multimap<time_t,int>::reverse_iterator riter;
for(riter=indexTable.rbegin();riter!=indexTable.rend();riter++,index++)
{

int i=riter->second;
m_list_log.InsertItem(index,"");
for(int j=0;j<6;j++)
{
m_list_log.SetItemText(index,j,Datalist[j][i]);
}
}
}


其中涉及到时间比较大小同样列举两种方法:


第一种:COleDateTime t1; t1.ParseDateTime(“2016/10/19 18:57:10”);   


第二种:

tm tm_Temp;
time_t time_Ret;
CString AFormat="%d/%d/%d %d:%d:%d";
CString strtime = m_list_log.GetItemText(row,0);
sscanf(strtime,AFormat,
&(tm_Temp.tm_year),   
&(tm_Temp.tm_mon),   
&(tm_Temp.tm_mday),  
&(tm_Temp.tm_hour),  
&(tm_Temp.tm_min),  
&(tm_Temp.tm_sec));
tm_Temp.tm_year -= 1900;  
tm_Temp.tm_wday=0;  
tm_Temp.tm_yday=0;  
tm_Temp.tm_isdst = 0;
time_Ret = mktime(&tm_Temp);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值