关于dataGridView的完全自定义排序
dataGridView排序默认为自动,排序控件内的数据。
但是,我们有一个情况出现了,我们的数据是分页的,排序是要全局排序怎么办呢?
这个问题也很简单,当绑定数据集和分页控件时,它会自动对数据源排序。
OK,这样,一般情况下,是不需要写代码的。
但是,啊,就怕但是出现。对,又一个情况出现了,因为数据源特别大,所以在调用数据源之前,已经分页了,那又怎么办呢?
如
select top 10 * from a where id between 11 and 20
那又如何排序呢?
好的,我们就是诊对如此情况来做的。
我的分页控件是完全自己定义的,不在此讨论范围内。
首先,我们设定列的排序模式为程序排序,代码如下:
TextCell03.SortMode = DataGridViewColumnSortMode.Programmatic;
// TextCell03 为一个具体的文本列,这里不限列类型,只要是列就行,因为我们排序是用实际的字段排序,并非控件上的列。每个列都定义一下。
// TextCell03 为一个具体的文本列,这里不限列类型,只要是列就行,因为我们排序是用实际的字段排序,并非控件上的列。每个列都定义一下。
要在当前的窗体中定义几个全局变量用于排序,如:
排序的列标题,排序的实际字段,排序方式。
注:排序的列标题用于清除之前的排序标记。
1 //排序用
2 /// <summary>
3 /// 排序实际字段,默认为ID
4 /// </summary>
5 public string orderName = "ID";
6 /// <summary>
7 /// 排序列名称,默认为ID
8 /// </summary>
9 public string orderColumnName = "ID";
10 /// <summary>
11 /// 排序方式
12 /// </summary>
13 public string orderBy = "ASC";
2 /// <summary>
3 /// 排序实际字段,默认为ID
4 /// </summary>
5 public string orderName = "ID";
6 /// <summary>
7 /// 排序列名称,默认为ID
8 /// </summary>
9 public string orderColumnName = "ID";
10 /// <summary>
11 /// 排序方式
12 /// </summary>
13 public string orderBy = "ASC";
然后我们处理列的点击和显示。
在窗体设计代码中,我们加入列的单击事件,此事件会重写默认的排序操作。
this.dataGridView2.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(dataGridView2_ColumnHeaderMouseClick);
我们在方法dataGridView2_ColumnHeaderMouseClick中,写入:
1 private void dataGridView2_ColumnHeaderMouseClick(object sender, System.Windows.Forms.DataGridViewCellMouseEventArgs e)
2 {
3 DataGridViewColumn pColumn = dataGridView2.Columns[e.ColumnIndex];
4
5 string NewOrderColumnName = pColumn.HeaderText;
6 string NewOrderName = "";
7 switch (NewOrderColumnName) //这里为确定实际字段,可以用其它方式,通过列来得到实际字段。
8 {
9 case "ID":
10 NewOrderName = "ID";
11 break;
12 case "R":
13 NewOrderName = "IsNew";
14 break;
15 break;
16 case "标题":
17 NewOrderName = "TITLE";
18 break;
19 }
20
21 if (this.orderColumnName != NewOrderColumnName)
22 {
23 if(this.orderColumnName!=null) dataGridView2.Columns[this.orderColumnName].HeaderCell.SortGlyphDirection = SortOrder.None;
24 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
25 this.orderColumnName = NewOrderColumnName;
26 this.orderName = NewOrderName;
27 this.orderBy = "ASC";
28 }
29 else
30 {
31 if (orderBy == "ASC")
32 {
33 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending;
34 this.orderBy = "DESC";
35 }
36 else
37 {
38 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
39 this.orderBy = "ASC";
40 }
41 }
42
43 showdata(); //重载数据
44
45 }
2 {
3 DataGridViewColumn pColumn = dataGridView2.Columns[e.ColumnIndex];
4
5 string NewOrderColumnName = pColumn.HeaderText;
6 string NewOrderName = "";
7 switch (NewOrderColumnName) //这里为确定实际字段,可以用其它方式,通过列来得到实际字段。
8 {
9 case "ID":
10 NewOrderName = "ID";
11 break;
12 case "R":
13 NewOrderName = "IsNew";
14 break;
15 break;
16 case "标题":
17 NewOrderName = "TITLE";
18 break;
19 }
20
21 if (this.orderColumnName != NewOrderColumnName)
22 {
23 if(this.orderColumnName!=null) dataGridView2.Columns[this.orderColumnName].HeaderCell.SortGlyphDirection = SortOrder.None;
24 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
25 this.orderColumnName = NewOrderColumnName;
26 this.orderName = NewOrderName;
27 this.orderBy = "ASC";
28 }
29 else
30 {
31 if (orderBy == "ASC")
32 {
33 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending;
34 this.orderBy = "DESC";
35 }
36 else
37 {
38 pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
39 this.orderBy = "ASC";
40 }
41 }
42
43 showdata(); //重载数据
44
45 }
然后,我们只要在showdata()方法中,写上
string orderStr = "order by " + this.orderName + " " + this.orderBy;
然后串进SQL,直接载入即可。
以上方法仅为个人的笨方法,还请各位高人指点。
分类:
C#
标签:
dataGridView
, 自定义排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库