关于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,直接载入即可。
以上方法仅为个人的笨方法,还请各位高人指点。