您的位置:首页 > 编程语言 > ASP

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

2007-03-13 07:45 344 查看
ASP.Net2.0 GridView 多列排序,显示排序图标,分页。
最近在使用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="~/images/arrow-up.gif" SortDescImageUrl="~/images/arrow-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>





效果:



如需要源码者:请加入WinFX团队。

posted on 2006-06-21 21:38 随风飘散 阅读(2665) 评论(7) 编辑 收藏 引用 网摘 所属分类: VS2005控件开发ASP.NET2.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: