• 关于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,直接载入即可。

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

  • 相关阅读:
    元旦晚会
    CF906D Power Tower
    基于51单片机的多功能秒表(校赛作品)
    集训队第二次排位赛
    《史记》——五帝本纪第一,黄帝部分
    原创,让你的 "Ajax"请求华丽转身,给 "body" 或是 "Div" 加上Loading遮罩!
    Excel导出通用操作方式
    图片(img标签)的onerror事件,你有用过嘛?
    @Url.ActionLink 和 @Url.Action
    原创,自己做的一个简单实用的提示小插件,兼容性很好,基本上都兼容!
  • 原文地址:https://www.cnblogs.com/gsyifan/p/dataGridView_OrderBy_Diy.html
Copyright © 2020-2023  润新知