ASP.Net2.0 GridView 多列排序,显示排序图标,分页
ASP.Net2.0 GridView 多列排序,显示排序图标,分页
发布时间:2016-12-29 来源:查字典编辑
摘要:最近在使用ASP.net2.0的GridView控件时,发现排序与分页功能Microsoft实现的都很简单,比如排序,在点击列名的时候来触发...

最近在使用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事件中对尾页操作即可。

下面是多列排序与分页显示代码的演示

<script runat="server">

void PageDropDownList_SelectedIndexChanged(Object sender, EventArgs e)

{

GridViewRow pagerRow = CustomersGridView.BottomPagerRow;

DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");

CustomersGridView.PageIndex = pageList.SelectedIndex;

}

void CustomersGridView_DataBound(Object sender, EventArgs e)

{

GridViewRow pagerRow = CustomersGridView.BottomPagerRow;

LinkButton linkBtnFirst = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnFirst");

LinkButton linkBtnPrev = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnPrev");

LinkButton linkBtnNext = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnNext");

LinkButton linkBtnLast = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnLast");

if (CustomersGridView.PageIndex == 0)

{

linkBtnFirst.Enabled = false;

linkBtnPrev.Enabled = false;

}

else if (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)

{

linkBtnLast.Enabled = false;

linkBtnNext.Enabled = false;

}

else if (CustomersGridView.PageCount<=0)

{

linkBtnFirst.Enabled = false;

linkBtnPrev.Enabled = false;

linkBtnNext.Enabled = false;

linkBtnLast.Enabled = false;

}

DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");

Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");

if (pageList != null)

{

for (int i = 0; i < CustomersGridView.PageCount; i++)

{

int pageNumber = i + 1;

ListItem item = new ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());

if (i == CustomersGridView.PageIndex)

{

item.Selected = true;

}

pageList.Items.Add(item);

}

}

if (pageLabel != null)

{

int currentPage = CustomersGridView.PageIndex + 1;

pageLabel.Text = "当前页: " + currentPage.ToString() +

" / " + CustomersGridView.PageCount.ToString();

}

}

</script>

<html>

<body>

<form id="Form1" runat="server">

<h3>

GridView PagerTemplate Example</h3>

<asp:WebGridView ID="CustomersGridView" DataSourceID="CustomersSqlDataSource" AutoGenerateColumns="true"

AllowPaging="true" OnDataBound="CustomersGridView_DataBound" SortAscImageUrl="~imagesarrow-up.gif" SortDescImageUrl="~imagesarrow-down.gif" runat="server" AllowSorting="True" Width="723px">

<PagerStyle ForeColor="Blue" BackColor="LightBlue" />

<PagerTemplate>

<table width="100%">

<tr>

<td width="70%">

<asp:Label ID="MessageLabel" ForeColor="Blue" Text="页码:" runat="server" />

<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"

runat="server" />

<asp:LinkButton CommandName="Page" CommandArgument="First" ID="linkBtnFirst" runat="server">首页</asp:LinkButton>

<asp:LinkButton CommandName="Page" CommandArgument="Prev" ID="linkBtnPrev" runat="server">上一页</asp:LinkButton>

<asp:LinkButton CommandName="Page" CommandArgument="Next" ID="linkBtnNext" runat="server">下一页</asp:LinkButton>

<asp:LinkButton CommandName="Page" CommandArgument="Last" ID="linkBtnLast" runat="server">末页</asp:LinkButton>

</td>

<td width="70%" align="right">

<asp:Label ID="CurrentPageLabel" ForeColor="Blue" runat="server" />

</td>

</tr>

</table>

</PagerTemplate>

</asp:WebGridView>

<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"

ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="server">

</asp:SqlDataSource>

</form>

</body>

</html>

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类