ASP.Net2.0GridView多列排序,显示排序图标,分页
最近在使用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>
相关文章
- struts2 ognl 正则表达式-asp
- 深入探索ASP与MySQL的连接之旅(asp测试连接mysql)
- ASP程序查询MSSQL数据库的实践经验(asp查询mssql)
- 用MSSQL查询ASP:从初学者到高手(mssql查询asp)
- ASP构建Web应用MySQL必不可少(asp需要mysql)
- 教程使用ASP连接MySQL,视频教程掌握一步搞定(asp连接mysql视频)
- ASP将MySQL数据迁移到新环境(asp迁移mysql)
- 解决ASP读取MySQL乱码问题(asp读取mysql乱码)
- ASP技术可以驱动MySQL吗(asp能连接mysql吗)
- ASP绑定MySQL实现功能强大的数据库访问(asp绑定mysql)
- 使用MySQL轻松实现ASP数据库应用(asp数据库用mysql)
- ASP快速连接MySQL解决方案(asp如何连mysql)
- ASP操作Oracle 轻松实现查询驱动结果(asp查询oracle)
- ASP技术保障Oracle数据库安全备份(asp备份oracle)
- VBS、ASP代码语法加亮显示的类
- ASP.net基础知识之常见错误分析
- asp.net下jqueryjason高效传输数据
- asp.net按字节检查包含全半角的文字
- asp.net连接数据库增加,修改,删除,查询代码
- asp实现的冒泡排序程序
- asp.net下加密Config的方法
- Asp.net中static变量和viewstate的使用方法(谨慎)
- asp.net中eval不能定义变量的问题的解决方法
- ASP.NET批量下载文件的方法
- asp.net页面中添加普通视频的几种方式介绍