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