关于dataGridView的完全⾃定义排序
dataGridView排序默认为⾃动,排序控件内的数据。
但是,我们有⼀个情况出现了,我们的数据是分页的,排序是要全局排序怎么办呢?
这个问题也很简单,当绑定数据集和分页控件时,它会⾃动对数据源排序。
OK,这样,⼀般情况下,是不需要写代码的。
但是,啊,就怕但是出现。对,⼜⼀个情况出现了,因为数据源特别⼤,所以在调⽤数据源之前,已经分页了,那⼜怎么办呢?
select top10*from a where id between11and20
那⼜如何排序呢?
好的,我们就是诊对如此情况来做的。
我的分页控件是完全⾃⼰定义的,不在此讨论范围内。
⾸先,我们设定列的排序模式为程序排序,代码如下:
TextCell03.SortMode = DataGridViewColumnSortMode.Programmatic;
// TextCell03 为⼀个具体的⽂本列,这⾥不限列类型,只要是列就⾏,因为我们排序是⽤实际的字段排序,并⾮控件上的列。每个列都定义⼀下。
要在当前的窗体中定义⼏个全局变量⽤于排序,如:
排序的列标题,排序的实际字段,排序⽅式。
注:排序的列标题⽤于清除之前的排序标记。
1//排序⽤
2///<summary>
3///排序实际字段,默认为ID
4///</summary>
5public string orderName = "ID";
6///<summary>
7///排序列名称,默认为ID
8///</summary>
9public string orderColumnName = "ID";
10///<summary>
11///排序⽅式
12///</summary>
13public string orderBy = "ASC";
然后我们处理列的点击和显⽰。
datagridview数据源在窗体设计代码中,我们加⼊列的单击事件,此事件会重写默认的排序操作。
this.dataGridView2.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMou
seEventHandler(dataGridView2_ColumnHeaderMouseClick);我们在⽅法dataGridView2_ColumnHeaderMouseClick中,写⼊:
1private void dataGridView2_ColumnHeaderMouseClick(object sender, System.Windows.Forms.DataGridViewCellMouseEventArgs e)
2        {
3            DataGridViewColumn pColumn = dataGridView2.Columns[e.ColumnIndex];
4
5string NewOrderColumnName = pColumn.HeaderText;
6string NewOrderName = "";
7switch (NewOrderColumnName)  //这⾥为确定实际字段,可以⽤其它⽅式,通过列来得到实际字段。
8            {
9case"ID":
10                    NewOrderName = "ID";
11break;
12case"R":
13                    NewOrderName = "IsNew";
14break;
15break;
16case"标题":
17                    NewOrderName = "TITLE";
18break;
19            }
20
21if (derColumnName != NewOrderColumnName)
22            {
derColumnName!=null) dataGridView2.derColumnName].HeaderCell.SortGlyphDirection = SortOrder.None;
24                pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
28            }
29else
30            {
31if (orderBy == "ASC")
32                {
33                    pColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending; derBy = "DESC";
35                }
36else
37                {
38                    pColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending; derBy = "ASC";
40                }
41            }
42
43            showdata();  //重载数据
44
45        }
然后,我们只要在showdata()⽅法中,写上
string orderStr = "order by " + derName + " " + derBy;
然后串进SQL,直接载⼊即可。
以上⽅法仅为个⼈的笨⽅法,还请各位⾼⼈指点。