GridView多列排序

Posted ps122

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
View Code

 

以上是关于GridView多列排序的主要内容,如果未能解决你的问题,请参考以下文章

使用Javascript的动态gridview的多列的列总和

安卓gridview 网格,多行多列实现

如何从片段中检索gridview中的图像?

gridview安卓实现单行多列横向滚动

片段中gridview的Android文本和图像适配器

GridView可以根据需求动态设置显示多列中的某几列吗?