关于dataGridView的完全自定义排序

dataGridView排序默认为自动,排序控件内的数据。

但是,我们有一个情况出现了,我们的数据是分页的,排序是要全局排序怎么办呢?

这个问题也很简单,当绑定数据集和分页控件时,它会自动对数据源排序。

OK,这样,一般情况下,是不需要写代码的。

但是,啊,就怕但是出现。对,又一个情况出现了,因为数据源特别大,所以在调用数据源之前,已经分页了,那又怎么办呢?

如 

select top 10 * from a where id between 11 and 20

 

 那又如何排序呢?

好的,我们就是诊对如此情况来做的。

我的分页控件是完全自己定义的,不在此讨论范围内。

首先,我们设定列的排序模式为程序排序,代码如下:


TextCell03.SortMode = DataGridViewColumnSortMode.Programmatic;
// 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";

 

然后我们处理列的点击和显示。

在窗体设计代码中,我们加入列的单击事件,此事件会重写默认的排序操作。

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         }


然后,我们只要在showdata()方法中,写上

 

 string orderStr = "order by " + this.orderName + " " + this.orderBy;

 

然后串进SQL,直接载入即可。

以上方法仅为个人的笨方法,还请各位高人指点。

 

posted @ 2011-06-08 10:38  翼帆  阅读(2593)  评论(0编辑  收藏  举报