对ListCtrl列表控件按列进行排序
来源:互联网 发布:全国大学生网络文化节 编辑:程序博客网 时间:2024/06/06 20:16
新建一个对话框工程,拖一个列表控件,ID是IDC_LIST,属性是Report报表模式。
在对话框的初始化函数OnInitDialog()中对列表框进行初始化,初始化为一个具有三列的列表框,分别为:编号、姓名、国家。
然后在拖三个按钮。第一个按钮控制按列表控件的第一列进行循环排序;第二个按钮控制按列表控件的第二列名字的汉语拼音由大向小排列,第三个按钮控制按列表控件的第三列国家的ASCII码值由小到大进行排列。
为列表控件绑定一个变量m_List,定义一个BOOL型变量bFlag控制按第一列循环排序,在定义三个排序函数:
public:CListCtrl m_List;static BOOL bFlag;int static CALLBACK CompareByNum(LPARAM lP1, LPARAM lP2, LPARAM lP);int static CALLBACK CompareByName(LPARAM lP1, LPARAM lP2, LPARAM lP);int static CALLBACK CompareByNation(LPARAM lP1, LPARAM lP2, LPARAM lP);
bFlag进行初始化:
BOOL CListSortDlg::bFlag = TRUE;
在cpp文件中,首先初始化列表控件,具有三列:
BOOL CListSortDlg::OnInitDialog(){CDialogEx::OnInitDialog();//............m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_List.InsertColumn(0,"编号",LVCFMT_CENTER,180,-1);//插入三个标头m_List.InsertColumn(1,"姓名",LVCFMT_CENTER,180,-1);m_List.InsertColumn(2,"国籍",LVCFMT_CENTER,180,-1);int nCount = m_List.GetItemCount();//插入第一行m_List.InsertItem(nCount,"1001");m_List.SetItemText(nCount,1,"李四");m_List.SetItemText(nCount,2,"China");nCount = m_List.GetItemCount();//插入第二行m_List.InsertItem(nCount,"1004");m_List.SetItemText(nCount,1,"王五");m_List.SetItemText(nCount,2,"Japan");nCount = m_List.GetItemCount();//插入第三行m_List.InsertItem(nCount,"1003");m_List.SetItemText(nCount,1,"张三");m_List.SetItemText(nCount,2,"Usa");nCount = m_List.GetItemCount();//插入第四行m_List.InsertItem(nCount,"1005");m_List.SetItemText(nCount,1,"张婷");m_List.SetItemText(nCount,2,"Uk");return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}
按钮响应函数和排序函数:
int CALLBACK CListSortDlg::CompareByNum(LPARAM lP1, LPARAM lP2, LPARAM lP){CListSortDlg* pThis = (CListSortDlg*)lP;//分别获取参与排序的两个行的编号int nNum1 = atoi(pThis->m_List.GetItemText(lP1,0));int nNum2 = atoi(pThis->m_List.GetItemText(lP2,0));//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换//bFlag控制按编号进行循环排列,大->小、小->大、大->小、小->大......等等循环。if(bFlag) return nNum1 > nNum2;else return nNum2 > nNum1;}int CALLBACK CListSortDlg::CompareByName(LPARAM lP1, LPARAM lP2, LPARAM lP){CListSortDlg* pThis = (CListSortDlg*)lP;//分别获取参与排序的两个行的姓名CString str1 = pThis->m_List.GetItemText(lP1,1);CString str2 = pThis->m_List.GetItemText(lP2,1);//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换return str1 < str2;//按照名字的汉语拼音,由大向小排列}int CALLBACK CListSortDlg::CompareByNation(LPARAM lP1, LPARAM lP2, LPARAM lP){CListSortDlg* pThis = (CListSortDlg*)lP;//分别获取参与排序的两个行的国家CString str1 = pThis->m_List.GetItemText(lP1,2);CString str2 = pThis->m_List.GetItemText(lP2,2);//返回值:如果为真交换两个行的数据,如果为假两个行不进行交换return str1 > str2;//按照国家的ASCII码值进行排列,由小到大}void CListSortDlg::OnBnClickedBtn1()//按编号排序{bFlag = !bFlag;int nCount = m_List.GetItemCount()-1;while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2{m_List.SetItemData(nCount,nCount);nCount--;}m_List.SortItems(CompareByNum,(DWORD_PTR)this);}void CListSortDlg::OnBnClickedBtn2()//按姓名排序{bFlag = !bFlag;int nCount = m_List.GetItemCount()-1;while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2{m_List.SetItemData(nCount,nCount);nCount--;}m_List.SortItems(CompareByName,(DWORD_PTR)this);}void CListSortDlg::OnBnClickedBtn3()//按国籍排序{bFlag = !bFlag;int nCount = m_List.GetItemCount()-1;while (nCount > -1)//为每一行绑定一个值,将来这个值会传递给排序函数的参数lp1和lp2{m_List.SetItemData(nCount,nCount);nCount--;}m_List.SortItems(CompareByNation,(DWORD_PTR)this);}
以按姓名排列为例,如图:
阅读全文
0 0
- 对ListCtrl列表控件按列进行排序
- 对table列表按某一列进行排序
- Python3 对列表按元组指定列进行排序
- 对列表进行排序
- 对二维数组进行按列排序
- 列表控件ListCtrl用法
- MFC-ListCtrl(列表控件)
- 列表控件的列排序
- wxPython - ListCtrl列表排序
- GridView 对列进行排序
- 对列表进行排序.doc
- ext的排序,根据点击列表列, 对所有数据进行排序, 而不是仅仅对当前页排序
- 如何按列 Visual C# 排序列表视图控件
- 设置列表控件(ListCtrl)各种颜色
- 设置列表控件(ListCtrl)各种颜色
- 在ListCtrl中进行排序
- 在ListCtrl中进行排序
- 在ListCtrl中进行排序
- 5.2 绑定服务的三种方式:扩展 Binder 类、使用 Messenger、使用 AIDL
- 洛谷 1064 [NOIP2004] 虫食算 dfs+剪枝
- 关于错误An exception has occurred,use %tb to see the full traceback,SystemExit
- 高斯白噪声与高斯色噪声的区别
- 数据挖掘---数据处理
- 对ListCtrl列表控件按列进行排序
- C++ STL中哈希表 hash_map从头到尾详细介绍
- ArcGIS ModelBuilder 迭代器参数传入字段计算器方法
- noip2016组合数问题
- 我的大学生活
- UVA
- codevs 2173 忠诚 (st表·裸)
- <C++>const在不同对象不同位置中的作用
- 5.3 ContentProvider使用全解