Recently when using the GridView control of ASP.net 2.0, I found that the sorting and paging functions implemented by Microsoft are very simple. For example, sorting triggers the PostBack of the entire page when clicking the column name, and then sorting, but there is no one on the column header. Displaying icons in ascending and descending order will confuse the end user when using them because they don’t know whether it is ascending or descending order. So the first problem to be solved today is to display the icons on the column in ascending and descending order. The second problem to be solved is By default, GridView can only sort by one column, that is, it cannot be sorted by multiple columns. In practical applications, sorting by only one column cannot meet business needs. The third problem is GridView paging. GridView predefined paging page number display , relatively simple, but in actual applications, paging may not be as simple as just displaying the home page, previous page, next page, last page, or numerical page numbers. It should be more necessary to jump, the current page number, the total number of pages, etc. , more detailed information.
First: GridView multi-column sorting and sorting icon display.
First, we can create a new class library program. We mainly need to reference the System.Web.Dll file and then create a new class. This class inherits the GridView control. We only need to restructure some methods. Can.
The example of my demonstration uses single column sorting. If multi-column sorting is enabled, set the AllowMultiColumnSorting of the control to True to achieve multi-column sorting.
1 public class WebGridView:GridView
2 {
3 attributes#region attributes
4 /**//// <summary>
5 /// Whether to enable or disable multi-column sorting
6 /// </summary>
7 [
8 Description("Whether to enable multi-column sorting function"),
9 Category("Sort"),
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 sets
20 {
21 AllowSorting = true;
22 ViewState["EnableMultiColumnSorting"] = value;
twenty three }
twenty four }
25 /**//// <summary>
26 /// Display icon in ascending order
27 /// </summary>
28 [
29 Description("Show icon when sorting ascending"),
30 Category("Sort"),
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 /// Display icons in descending order
49 /// </summary>
50 [
51 Description("Show icon in descending order"),
52 Category("Sort"),
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 sets
64 {
65 ViewState["SortImageDesc"] = value;
66 }
67 }
68 #endregion
69 Overriding method#region Overriding method
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 protected method #region protected method
93 /**//// <summary>
94 /// Get sorting expression
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 /// Modify sort order
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 /// Get the current expression to sort the selected column
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 /// Draw pictures in ascending and descending order
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 }
Second: Detailed paging information display. This function is not encapsulated into a control form. You can directly operate the last page in the GridView_DataBound event.
The following is a demonstration of multi-column sorting and paging display code
<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 = "Current page: " + 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="Page number:" runat="server" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="server" />
<asp:LinkButton CommandName="Page" CommandArgument="First" ID="linkBtnFirst" runat="server">Home</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Prev" ID="linkBtnPrev" runat="server">Previous page</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Next" ID="linkBtnNext" runat="server">Next page</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Last" ID="linkBtnLast" runat="server">Last page</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>