最近在使用ASP.net 2.0的GridView 控件时,发现排序与分页功能Microsoft实现的都很简单,比如排序,在点击列名的时候来触发整页的PostBack,然后排序,但是在列头上没有一个显示升序降序的图标,这会让最终用户使用时很迷惑,因为不知道是升序了还是降序了,所以今天首先解决的第一问题就是升序降序在列上显示图标,第二要解决的问题是默认GridView按列排序只能排一列的,也就是不能进行多列排序,而在实际应用中仅仅按照一列来排序是不能满足业务需求的,第三是GridView 分页问题,GridView预定义的分页页码显示,比较简单,而实际应用中,分页可能不是只显示首页,上一页,下一页,末页,或者是数字的页码那么简单,应该更需要,跳转,当前的页码,总页数等,更详尽的信息。 第一:GridView 多列排序与排序图标显示 首先我们可以新建一个类库程序,主要需要引用System.Web.Dll文件 然后新建一个类,这个类继承与GridView控件,我们只需要对部分方法进行重新即可。 我的演示的例子,采用了单列排序,如果启用多列排序,把控件的AllowMultiColumnSorting设置为True就是 多列排序。 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 } 第二:详尽的分页信息显示,此功能没有封装成控件形式,直接在GridView_DataBound事件中对尾页操作即可。 下面是多列排序与分页显示代码的演示 (编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|