GridView多列排序

  1 public class WebGridView:GridView
  2 {
  3     属性#region 属性
  4     /**//// <summary>
  5     /// 是否启用或者禁止多列排序
  6     /// </summary>
  7     [
  8     Description("是否启用多列排序功能"),
  9     Category("排序"),
 10     DefaultValue("false"),
 11     ]
 12     public bool AllowMultiColumnSorting
 13     {
 14         get
 15         {
 16             object o = ViewState["EnableMultiColumnSorting"];
 17             return (o != null ? (bool)o : false);
 18         }
 19         set
 20         {
 21             AllowSorting = true;
 22             ViewState["EnableMultiColumnSorting"] = value;
 23         }
 24     }
 25     /**//// <summary>
 26     /// 升序时显示图标
 27     /// </summary>
 28     [
 29     Description("升序时显示图标"),
 30     Category("排序"),
 31     Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
 32     DefaultValue(""),
 33
 34     ]
 35     public string SortAscImageUrl
 36     {
 37         get
 38         {
 39             object o = ViewState["SortImageAsc"];
 40             return (o != null ? o.ToString() : "");
 41         }
 42         set
 43         {
 44             ViewState["SortImageAsc"] = value;
 45         }
 46     }
 47     /**//// <summary>
 48     /// 降序时显示图标
 49     /// </summary>
 50     [
 51     Description("降序时显示图标"),
 52     Category("排序"),
 53     Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
 54     DefaultValue(""),
 55     ]
 56     public string SortDescImageUrl
 57     {
 58         get
 59         {
 60             object o = ViewState["SortImageDesc"];
 61             return (o != null ? o.ToString() : "");
 62         }
 63         set
 64         {
 65             ViewState["SortImageDesc"] = value;
 66         }
 67     }
 68     #endregion
 69     重写方法#region 重写方法
 70     protected override void OnSorting(GridViewSortEventArgs e)
 71     {
 72         if (AllowMultiColumnSorting)
 73         {
 74             e.SortExpression = GetSortExpression(e);
 75         }
 76
 77         base.OnSorting(e);
 78     }
 79     protected override void OnRowCreated(GridViewRowEventArgs e)
 80     {
 81         if (e.Row.RowType == DataControlRowType.Header)
 82         {
 83             if (SortExpression != String.Empty)
 84             {
 85                 DisplaySortOrderImages(SortExpression, e.Row);
 86                 this.CreateRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
 87             }
 88         }
 89         base.OnRowCreated(e);
 90     }
 91     #endregion
 92     受保护的方法#region 受保护的方法
 93     /**//// <summary>
 94     ///  获取排序表达式
 95     /// </summary>
 96     protected string GetSortExpression(GridViewSortEventArgs e)
 97     {
 98         string[] sortColumns = null;
 99         string sortAttribute = SortExpression;
100
101         if (sortAttribute != String.Empty)
102         {
103             sortColumns = sortAttribute.Split(",".ToCharArray());
104         }
105         if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
106         {
107             sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
108         }
109         else
110         {
111             sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
112         }
113         return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115     }
116     /**//// <summary>
117     ///  修改排序顺序
118     /// </summary>
119     protected string ModifySortExpression(string[] sortColumns, string sortExpression)
120     {
121         string ascSortExpression = String.Concat(sortExpression, " ASC ");
122         string descSortExpression = String.Concat(sortExpression, " DESC ");
123
124         for (int i = 0; i < sortColumns.Length; i++)
125         {
126
127             if (ascSortExpression.Equals(sortColumns[i]))
128             {
129                 sortColumns[i] = descSortExpression;
130             }
131
132             else if (descSortExpression.Equals(sortColumns[i]))
133             {
134                 Array.Clear(sortColumns, i, 1);
135             }
136         }
137
138         return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
139
140     }
141     /**//// <summary>
142     ///  获取当前的表达式对所选列进行排序
143     /// </summary>
144     protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
145     {
146         sortOrder = "";
147         sortOrderNo = -1;
148         for (int i = 0; i < sortColumns.Length; i++)
149         {
150             if (sortColumns[i].StartsWith(sortColumn))
151             {
152                 sortOrderNo = i + 1;
153                 if (AllowMultiColumnSorting)
154                 {
155                     sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
156                 }
157                 else
158                 {
159                     sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
160                 }
161             }
162         }
163     }
164     /**//// <summary>
165     ///  绘制升序降序的图片
166     /// </summary>
167     protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
168     {
169         string[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171         for (int i = 0; i < dgItem.Cells.Count; i++)
172         {
173             if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
174             {
175                 string sortOrder;
176                 int sortOrderNo;
177                 string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178                 SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
179                 if (sortOrderNo > 0)
180                 {
181                     string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
182
183                     if (sortImgLoc != String.Empty)
184                     {
185                         Image imgSortDirection = new Image();
186                         imgSortDirection.ImageUrl = sortImgLoc;
187                         dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189                     }
190                     else
191                     {
192
193                         if (AllowMultiColumnSorting)
194                         {
195                             Literal litSortSeq = new Literal();
196                             litSortSeq.Text = sortOrderNo.ToString();
197                             dgItem.Cells[i].Controls.Add(litSortSeq);
198
199                         }
200                     }
201                 }
202             }
203         }
204
205     }
206     #endregion
207 }

时间: 2024-07-29 12:51:26

GridView多列排序的相关文章

datagridview 日期列排序

1.datagridview 日期列排序 private void Form1_Load(object sender, EventArgs e) { //方法1 dataGridView1.ColumnHeaderMouseClick += tempView_ColumnHeaderMouseClick; DataTable dt = Create(); dataGridView1.DataSource = dt; //方法2 dataGridView2.SortCompare += dataG

三重for循环实现对二维数组的按列排序(JavaScript)

由C语言联想到的:三重for循环实现对二维数组的按列排序. 自己写的,水平有限,可能存在错误,忘指正~ function circle() { var a = [ [1, 4, 3, 2], [8, 6, 5, 7], [3, 7, 2, 5], [4, 8, 6, 1] ], t = 0, i, j, k; for(i = 0;i < 4;i++) { for(j = 0;j < 3;j++) { for(k = j + 1;k < 4;k++) { if(a[j][i] > a

C语言之基本算法42—矩阵转置及按行按列排序

//矩阵转置 按行按列排序 /* ================================================================== 题目:输入m*n矩阵,按行升序排列输出. 输入: 4 3 5 6 2 9 8 1 2 8 7 1 2 3 8 输出: 2 3 4 5 6 1 2 8 8 9 1 2 3 7 8 ================================================================== */ #includ

二维数组的列排序

给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列.如果第i列到最后一列都相同,则按原序排列. 实现以下接口: 输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组. 调用者会保证: 比如输入数组为: 1,2,3 2,3,4 2,3,1 1,3,1 按第二列排序: 输出: 1,2,3 2,3,1 1,3,1 2,3,4 分析:从最后一列开始使用稳定的排序

ExtJS4.2 Grid知识点七:显示行号、斑马线效果(奇偶行背景色不一致)、复制单元格文字、禁止点击列排序

本节主要学习ExtJS4.2 Grid显示行号.斑马线效果(奇偶行背景色不一致).复制单元格文字.禁止点击列排序.禁止列头部右侧菜单,示例图片: 在线演示  /  在线演示 主要内容如下: 显示行号 斑马线效果(奇偶行背景颜色不一致) 复制单元格问题 禁止点击列排序 禁止列头部右侧菜单 1.显示行号 在Grid中增加行号列,xtype指定为rownumberer. {header: 'NO',xtype: 'rownumberer',width: 40,sortable: false} 2.斑马

datatable 给指定的列排序或指定的列不排序

table = $('#dtProcess').autoOptionTable({ "ordering": true,//feu所有的列排序 "columnDefs": [ { "bSortable": false, "aTargets": [ 1,2 ]//指定2,3列不排序 } ] });

分别使用shell和python实现两列排序

有一个文件1.txt如下,要求使用shell和python实现排序,先按照第一列排序,第一列相同再按照第二列排序,并且输出到另外一个文件2.txt LZdeMacBook-Pro:~ lz$ cat 1.txt 23 d 26 t 12 y 43 h 5 k 12 a shell实现: LZdeMacBook-Pro:~ lz$ sort  -k1,1n -k2,2 1.txt > 2.txt LZdeMacBook-Pro:~ lz$ cat 2.txt 5 k 12 a 12 y 23 d

WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失效,就是点击他的列表头无法进行排序了.xaml如下:<DataGridTextColumn Width="100" Header="{res:Localize Flexem.Studio.HMIControls.AddressLabel.DataType}">

列排序算法

It is amazing!列排序算法看起来很奇怪,但是它真的可以用来对所有数据排序,只不过需要有一些条件. 列排序算法是用于包含n个元素的矩形数组的排序,这个数组r行s列,满足下面三个条件: 1) r为偶数 2) s为r的因子 3) r大于等于2s2 这里就不去证明这个算法的正确性,证明见算法导论思考题8-7.感觉对于矩阵的问题,很多人第一反应会是 int a[M][N],或者使用int **a. 其实矩阵是一种数据表现形式,类似于最大最小堆,树结构一样,底层上并不是真正在对具象化的图形结构进