目标
点击列表控件的列头,实现对列表数据的排序。实现方法
Step1
选择List Control控件,拖动到对话框中,右键控件,选择Add Event Handler,在Message Type栏选择LVN_COLUMNCLICK消息,添加相应的消息响应函数(例如OnLvnColumnclickLiscontract)。Step2
在OnLvnColumnclickLiscontract函数中添加代码,如下所示:
void Cwhu_ContractDlg::OnLvnColumnclickLiscontract(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
int colum = pNMLV->iSubItem;
static int mode = 0;
whu_SortContactList(m_List,colum,mode);
if (mode == 0)
{
mode = 1;
}
else{
mode = 0;
}
*pResult = 0;
}
Step3
排序函数whu_SortContactList(m_List,colum,mode)的实现。
void Cwhu_ContractDlg::whu_SortContactList(CListCtrl &m_List,int colum,int mode)
{
//m_ContactListData[colum]
//对字符进行排序//
CStringArray m_ArrData[20];
for (int i=0;i<m_List.GetItemCount();i++)
{
for (int j=0;j<m_List.GetHeaderCtrl()->GetItemCount();j++)
{
m_ArrData[j].Add(m_List.GetItemText(i,j));
}
}
CString m_str1;
CString m_str2;
for (int row = 1;row <m_ArrData[0].GetCount();row++)
{
for (int i=0;i<m_ArrData[0].GetCount()-1;i++)
{
m_str1 = m_ArrData[colum].GetAt(i);
m_str2 = m_ArrData[colum].GetAt(i+1);
if (mode == 0) //正序
{
if (m_str1 > m_str2)
{
for (int j=1;j<m_List.GetHeaderCtrl()->GetItemCount();j++)
{
CString m_str3 = m_ArrData[j].GetAt(i);
CString m_str4 = m_ArrData[j].GetAt(i+1);
m_ArrData[j].RemoveAt(i);
m_ArrData[j].RemoveAt(i);
m_ArrData[j].InsertAt(i,m_str3);
m_ArrData[j].InsertAt(i,m_str4);
m_str3 = m_ArrData[j].GetAt(i);
m_str4 = m_ArrData[j].GetAt(i+1);
}
}
}
else if (mode == 1)//反序
{
if (m_str1 < m_str2)
{
for (int j=1;j<m_List.GetHeaderCtrl()->GetItemCount();j++)
{
CString m_str3 = m_ArrData[j].GetAt(i);
CString m_str4 = m_ArrData[j].GetAt(i+1);
m_ArrData[j].RemoveAt(i);
m_ArrData[j].RemoveAt(i);
m_ArrData[j].InsertAt(i,m_str3);
m_ArrData[j].InsertAt(i,m_str4);
m_str3 = m_ArrData[j].GetAt(i);
m_str4 = m_ArrData[j].GetAt(i+1);
}
}
}
}
}
//插入数据//
m_List.DeleteAllItems();
for (int i=0;i<m_ArrData[0].GetSize();i++)
{
char buf[3];
itoa(i+1,buf,10);
m_List.InsertItem(i,buf);
for (int j =0;j<m_List.GetHeaderCtrl()->GetItemCount();j++)
{
m_List.SetItemText(i,j,m_ArrData[j].GetAt(i));
}
}
}
实现效果
点击之前:
点击之后: