zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

ASP.Net2.0GridView多列排序,显示排序图标,分页

ASP排序 显示 分页 图标 GridView 多列 net2.0
2023-06-13 09:13:42 时间

   最近在使用ASP.net2.0的GridView控件时,发现排序与分页功能Microsoft实现的都很简单,比如排序,在点击列名的时候来触发整页的PostBack,然后排序,但是在列头上没有一个显示升序降序的图标,这会让最终用户使用时很迷惑,因为不知道是升序了还是降序了,所以今天首先解决的第一问题就是升序降序在列上显示图标,第二要解决的问题是默认GridView按列排序只能排一列的,也就是不能进行多列排序,而在实际应用中仅仅按照一列来排序是不能满足业务需求的,第三是GridView分页问题,GridView预定义的分页页码显示,比较简单,而实际应用中,分页可能不是只显示首页,上一页,下一页,末页,或者是数字的页码那么简单,应该更需要,跳转,当前的页码,总页数等,更详尽的信息。

第一:GridView多列排序与排序图标显示

首先我们可以新建一个类库程序,主要需要引用System.Web.Dll文件
然后新建一个类,这个类继承与GridView控件,我们只需要对部分方法进行重新即可。
我的演示的例子,采用了单列排序,如果启用多列排序,把控件的AllowMultiColumnSorting设置为True就是
多列排序。

 1   publicclassWebGridView:GridView
 2   {
 3       属性#region属性
 4       /**////<summary>
 5       ///是否启用或者禁止多列排序
 6       ///</summary>
 7       [
 8       Description("是否启用多列排序功能"),
 9       Category("排序"),
 10       DefaultValue("false"),
 11       ]
 12       publicboolAllowMultiColumnSorting
 13       {
 14           get
 15           {
 16               objecto=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       publicstringSortAscImageUrl
 36       {
 37           get
 38           {
 39               objecto=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       publicstringSortDescImageUrl
 57       {
 58           get
 59           {
 60               objecto=ViewState["SortImageDesc"];
 61               return(o!=null?o.ToString():"");
 62           }
 63           set
 64           {
 65               ViewState["SortImageDesc"]=value;
 66           }
 67       }
 68       #endregion
 69       重写方法#region重写方法
 70       protectedoverridevoidOnSorting(GridViewSortEventArgse)
 71       {
 72           if(AllowMultiColumnSorting)
 73           {
 74               e.SortExpression=GetSortExpression(e);
 75           }
 76
 77           base.OnSorting(e);
 78       }
 79       protectedoverridevoidOnRowCreated(GridViewRowEventArgse)
 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       protectedstringGetSortExpression(GridViewSortEventArgse)
 97       {
 98           string[]sortColumns=null;
 99           stringsortAttribute=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           returnsortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115       }
116       /**////<summary>
117       /// 修改排序顺序
118       ///</summary>
119       protectedstringModifySortExpression(string[]sortColumns,stringsortExpression)
120       {
121           stringascSortExpression=String.Concat(sortExpression,"ASC");
122           stringdescSortExpression=String.Concat(sortExpression,"DESC");
123
124           for(inti=0;i<sortColumns.Length;i++)
125           {
126
127               if(ascSortExpression.Equals(sortColumns[i]))
128               {
129                   sortColumns[i]=descSortExpression;
130               }
131
132               elseif(descSortExpression.Equals(sortColumns[i]))
133               {
134                   Array.Clear(sortColumns,i,1);
135               }
136           }
137
138           returnString.Join(",",sortColumns).Replace(",,",",").TrimStart(",".ToCharArray());
139
140       }
141       /**////<summary>
142       /// 获取当前的表达式对所选列进行排序
143       ///</summary>
144       protectedvoidSearchSortExpression(string[]sortColumns,stringsortColumn,outstringsortOrder,outintsortOrderNo)
145       {
146           sortOrder="";
147           sortOrderNo=-1;
148           for(inti=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       protectedvoidDisplaySortOrderImages(stringsortExpression,GridViewRowdgItem)
168       {
169           string[]sortColumns=sortExpression.Split(",".ToCharArray());
170
171           for(inti=0;i<dgItem.Cells.Count;i++)
172           {
173               if(dgItem.Cells[i].Controls.Count>0&&dgItem.Cells[i].Controls[0]isLinkButton)
174               {
175                   stringsortOrder;
176                   intsortOrderNo;
177                   stringcolumn=((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178                   SearchSortExpression(sortColumns,column,outsortOrder,outsortOrderNo);
179                   if(sortOrderNo>0)
180                   {
181                       stringsortImgLoc=(sortOrder.Equals("ASC")?SortAscImageUrl:SortDescImageUrl);
182
183                       if(sortImgLoc!=String.Empty)
184                       {
185                           ImageimgSortDirection=newImage();
186                           imgSortDirection.ImageUrl=sortImgLoc;
187                           dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189                       }
190                       else
191                       {
192
193                           if(AllowMultiColumnSorting)
194                           {
195                               LiterallitSortSeq=newLiteral();
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事件中对尾页操作即可。
下面是多列排序与分页显示代码的演示

<scriptrunat="server">
   voidPageDropDownList_SelectedIndexChanged(Objectsender,EventArgse)
   {
       GridViewRowpagerRow=CustomersGridView.BottomPagerRow;
       DropDownListpageList=(DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
       CustomersGridView.PageIndex=pageList.SelectedIndex;
   }
   voidCustomersGridView_DataBound(Objectsender,EventArgse)
   {
       GridViewRowpagerRow=CustomersGridView.BottomPagerRow;
       LinkButtonlinkBtnFirst=(LinkButton)pagerRow.Cells[0].FindControl("linkBtnFirst");
       LinkButtonlinkBtnPrev=(LinkButton)pagerRow.Cells[0].FindControl("linkBtnPrev");
       LinkButtonlinkBtnNext=(LinkButton)pagerRow.Cells[0].FindControl("linkBtnNext");
       LinkButtonlinkBtnLast=(LinkButton)pagerRow.Cells[0].FindControl("linkBtnLast");
       if(CustomersGridView.PageIndex==0)
       {
           linkBtnFirst.Enabled=false;
           linkBtnPrev.Enabled=false;
       }
       elseif(CustomersGridView.PageIndex==CustomersGridView.PageCount-1)
       {
           linkBtnLast.Enabled =false;
           linkBtnNext.Enabled=false;
       }
       elseif(CustomersGridView.PageCount<=0)
       {
           linkBtnFirst.Enabled=false;
           linkBtnPrev.Enabled=false;
           linkBtnNext.Enabled=false;
           linkBtnLast.Enabled=false;
       }
       DropDownListpageList=(DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
       LabelpageLabel=(Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
       if(pageList!=null)
       {
           for(inti=0;i<CustomersGridView.PageCount;i++)
           {
               intpageNumber=i+1;
               ListItemitem=newListItem(pageNumber.ToString()+"/"+CustomersGridView.PageCount.ToString(),pageNumber.ToString());
               if(i==CustomersGridView.PageIndex)
               {
                   item.Selected=true;
               }
               pageList.Items.Add(item);
           }
       }
       if(pageLabel!=null)
       {
           intcurrentPage=CustomersGridView.PageIndex+1;
           pageLabel.Text="当前页:"+currentPage.ToString()+
             "/"+CustomersGridView.PageCount.ToString();
       }
   }
</script>
<html>
<body>
   <formid="Form1"runat="server">
       <h3>
           GridViewPagerTemplateExample</h3>
       <asp:WebGridViewID="CustomersGridView"DataSourceID="CustomersSqlDataSource"AutoGenerateColumns="true"
           AllowPaging="true"OnDataBound="CustomersGridView_DataBound"SortAscImageUrl="~\images\arrow-up.gif"SortDescImageUrl="~\images\arrow-down.gif"runat="server"AllowSorting="True"Width="723px">
           <PagerStyleForeColor="Blue"BackColor="LightBlue"/>
           <PagerTemplate>
               <tablewidth="100%">
                   <tr>
                       <tdwidth="70%">
                           <asp:LabelID="MessageLabel"ForeColor="Blue"Text="页码:"runat="server"/>
                           <asp:DropDownListID="PageDropDownList"AutoPostBack="true"OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
                               runat="server"/>
                           <asp:LinkButtonCommandName="Page"CommandArgument="First"ID="linkBtnFirst"runat="server">首页</asp:LinkButton>
                           <asp:LinkButtonCommandName="Page"CommandArgument="Prev"ID="linkBtnPrev"runat="server">上一页</asp:LinkButton>
                           <asp:LinkButtonCommandName="Page"CommandArgument="Next"ID="linkBtnNext"runat="server">下一页</asp:LinkButton>
                           <asp:LinkButtonCommandName="Page"CommandArgument="Last"ID="linkBtnLast"runat="server">末页</asp:LinkButton>
                       </td>
                       <tdwidth="70%"align="right">
                           <asp:LabelID="CurrentPageLabel"ForeColor="Blue"runat="server"/>
                       </td>
                   </tr>
               </table>
           </PagerTemplate>
      </asp:WebGridView>
       <asp:SqlDataSourceID="CustomersSqlDataSource"SelectCommand="Select[CustomerID],[CompanyName],[Address],[City],[PostalCode],[Country]From[Customers]"
           ConnectionString="<%$ConnectionStrings:NorthWindConnectionString%>"runat="server">
       </asp:SqlDataSource>
   </form>
</body>
</html>