C++ 简单实现MFC ListControl 点击列头排序
说明:
SetItemData可以为每一行绑定一个DWORD类型的变量。用GetItemData可以获得这个变量。
举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示。但往往做具体查询等操作时,你又需要用这个ID来完成。这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽。
由于绑定的是DWORD类型,因此还有一个扩展作用是绑定一个指针对象。比如这里我不再是一个ID主键了,而是需要关联一个数据结构,那么就可以把该数据结构对象的指针进行SetItemData绑定。这么做,可以省去再到一堆的数据结构数组中去查找的过程。
第一步:
定义全局变量:
int sort_column; // 记录点击的列 bool method; // 记录比较方法
第二步:
添加比较函数
// 比较函数 2staticint 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<2) { // int型比较 if (method) return atoi(lp1)-atoi(lp2); else return atoi(lp1)-atoi(lp1); } else { // 文字型比较 if (method) return lp1.CompareNoCase(lp2); else return lp2.CompareNoCase(lp1); } return0; }
第三步:添加列头点击事件 Lvn_Columnclick
void ClistDlg::OnLvnColumnclickxxx(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 sort_column = pNMLV->iSubItem;//点击的列 int count = m_list_port.GetItemCount(); for (int i=0;i<count;i++) m_list_port.SetItemData(i,i); // 每行的比较关键字,此处为列序号(点击的列号),可以设置为其他 比较函数的第一二个参数 m_list_port.SortItems(MyCompareProc,(DWORD_PTR)&m_list_port);//排序 第二个参数是比较函数的第三个参数 *pResult =0; }
完成。
method是用来控制顺序逆序的,看个人情况设置。
以上所述就是本文的全部内容了,希望大家能够喜欢。
相关推荐
-
C++实现的泛型List类分享
额,不要说我三心二意:一边在看.NET和CLR的原理.一边在看JavaScript.一边在看Java:有时看算法有时看Unity.Hibernate:有时看Hadoop有时看Redis:现在又开始看C++了. 以前觉得无论什么语言嘛,其实都差不多,核心思想基本一致.现在又不这么想了,其实语言的选择对软件的性能.可靠性.开发成本之类的关系很大,所以觉得还是要多接触一些比较核心的东西--那么自然是C++了.以前在学校学的C++完全是酱油,太水了基本没啥用,用来用去和C差不多,所以现在要自己学啦. 废
-
C++中 STL list详解及简单实例
C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo
-
C++中list的使用方法及常用list操作总结
C++中list的使用方法及常用list操作总结 一.List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.使用时需要添加头文件 #include <list> 二.List定义和初始化: list<int>lst1; //创建空list list<int> lst2(5); //创建含有5个元素的list list<int>lst3(3,2
-
C++ 使用模板实现一个List的实例
C ++使用模板写的一个List template<class T> class List { private: struct Node { T data; Node *next; }; //head Node *head; //size int length; //process Node *p; //temp Node *q; public: List() { head = NULL; length = 0; p = NULL; } void add(T t) { if(head == N
-
关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. 如printf()函数,其原型为:int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: printf( "%d ",i); printf( "%s "
-
基于C++ list中erase与remove函数的使用详解
erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器.如下: 复制代码 代码如下: list ParticleSystem;list::iterator pointer;if(pointer->dead == true){ pointer = ParticleSystem.erase(pointer);} 有一段关于错误使用erase的程序 复制代码 代码如下: using namespace std;int main(){ std::listtest_list;
-
C++ STL list 遍历删除出错解决方案
C++ STL list 遍历删除崩溃 错误用法一 下面这种用法会在for的地方崩溃,分析 第一次for循环的时候 it=0,当t.erase(it)执行完成之后 it就变成了 -17891602 表明it不能再作为迭代器进行运算,自然会报错. #include <map> #include <list> using namespace std; typedef std::list<int > TESTLIST; int _tmain(int argc, _TCHAR*
-
C++ 简单实现MFC ListControl 点击列头排序
说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量. 举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示.但往往做具体查询等操作时,你又需要用这个ID来完成.这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽
-
C# listview 点击列头排序的实例
实例如下: #region 自定义变量 int currentCol = -1; bool sort; #endregion//列头点击事件 private void lvw_ColumnClick(object sender, ColumnClickEventArgs e) { string Asc = ((char)0x25bc).ToString().PadLeft(4, ' '); string Des = ((char)0x25b2).ToString().PadLeft(4, ' '
-
DataGridView实现点击列头升序和降序排序
DataGridView 列有三种排序模式.每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一. DataGridViewColumnSortMode 值说明: Automatic文本框列的默认排序模式.除非将列标头用于选择,否则单击列标头将自动按此列对 DataGridView 排序,并显示一个指示排序顺序的标志符号(向上的三角箭头:升序排序:向下的三角箭头:降序排序). NotSortable非
-
jQuery EasyUI学习教程之datagrid点击列表头排序
这个示例展示如何排序datagrid通过点击列表头. 在datagrid的所有columns 可以通过点击列表头排序,你可以定义哪行可以排序,默认的列是不能排序的除非你设置sortable 属性为true 创建an DataGrid <table id="tt" class="easyui-datagrid" style="width:600px;height:250px" url="datagrid8_getdata.php&q
-
js简单实现表单中点击按钮动态增加输入框数量的方法
本文实例讲述了js简单实现表单中点击按钮动态增加输入框数量的方法.分享给大家供大家参考.具体如下: 这里演示表单中点击按钮动态增加输入框数量的方法,默认是没有输入框,点击按钮之后,输入框会不断的增加,每点击一次,增加一个,觉得挺不错吧,希望对你有所帮助. 运行效果如下图所示: 在线演示地址如下: http://demo.jb51.net/js/2015/js-table-input-button-add-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3
-
Vue 固定头 固定列 点击表头可排序的表格组件
原理是将原table的指定行,指定列clone一份放在其上 实现代码如下: <template> <div> <div id="divBox1" :style="{height:height}"> <table id="tbTest1" cellpadding="0" cellspacing="0" style="text-align:center;bac
-
JS简单模拟触发按钮点击功能的方法
本文实例讲述了JS简单模拟触发按钮点击功能的方法.分享给大家供大家参考,具体如下: <html> <head> <title>usually function</title> </head> <script> function load(){ //下面两种方法效果是一样的 document.getElementById("target").onclick(); document.getElementById(&qu
-
如何使用visual studio2019创建简单的MFC窗口(使用C++)
本文介绍了如何使用visual studio2019创建简单的MFC窗口(使用C++) ```cpp 使用visual studio 2019 创建过程请参考Bili的上一篇文章⬇⬇ →!使用visual studio 2019 创建简单的MFC窗口「使用底层的C语言」 #include<windows.h> //底层实现窗口的头文件 //6.处理窗口过程 //CALLBACK 代表_stdcall 参数的传递顺序:从右到左依次入栈,并且函数返回前清空堆栈 LRESULT CALLBACK W
-
jQuery+Ajax实现表格数据不同列标题排序(为表格注入活力)
表格大家都十分熟悉,如今的CSS也使得表格的布局越来越光彩耀人.但是,无论如何,都掩饰不了那些包装下的死板. 那么如何让那些死板的数据 更具有可读性.可用性,能够让我们那些数据在"动"呢? 下面我们使用jquery+ajax 来为表格注入些活力.主要实现的目的就是:将表格的列标题转化为按钮,点击不同的列标题,便按相应的列对数据进行排序.比如学生信息表,我点击"生日"列,这张表便按生日排序将结果呈现在我们面前.使用ajax来调用本页也避免了刷新页面所带来的折磨. 下面
-
android开发之横向滚动/竖向滚动的ListView(固定列头)
由于项目需要,我们需要一个可以横向滚动的,又可以竖向滚动的 表格.而且又要考虑大数据量(行)的展示视图.经过几天的研究终于搞定,做了一个演示.贴图如下: 好吧.让我们看思路是什么样的: 1. 上下滚动直接使用 listView来实现. 2. 左右滚动使用HorizontalScrollView,来处理滚动.我写一个类MyHScrollView继承 自它. 2.1 . ListView里的每行(row)分为 两部分,不滚动的和可滚动的区域.比如本demo的第一列,就是静态的.而后面的所有
随机推荐
- PHP中多线程的两个实现方法
- 字符串截取功能批处理
- 基于.Net中的协变与逆变的深入分析
- JS实现电商放大镜效果
- JS操作iframe里的dom(实例讲解)
- js实现时间显示几天前、几小时前或者几分钟前的方法集锦
- PHP 日期时间函数的高级应用技巧
- Android 自定义View 密码框实例代码
- Android 混合动画详解及实现代码
- JavaScript四种调用模式和this示例介绍
- javascript的indexOf忽略大小写的方法
- js 上传图片预览问题
- 妻子同网友私奔后,北京某老公在BBS上的留言
- 详解Jquery实现ready和bind事件
- 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名
- 使用node.js 获取客户端信息代码分享
- js怎么覆盖原有方法实现重写
- Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务
- Python循环语句中else的用法总结
- Android EditText实现扁平化的登录界面