Недавно при использовании элемента управления GridView в ASP.net 2.0 я обнаружил, что функции сортировки и разбиения на страницы, реализованные Microsoft, очень просты. Например, сортировка запускает PostBack всей страницы при щелчке по имени столбца, а затем сортировке, но это не так. в заголовке столбца нет никого. Отображение значков в порядке возрастания и убывания будет сбивать с толку конечного пользователя при их использовании, поскольку он не знает, в порядке ли это, по возрастанию или по убыванию. Поэтому первая проблема, которую необходимо решить сегодня, — это отображение значков. по столбцу в порядке возрастания и убывания. Вторая проблема, которую необходимо решить: по умолчанию GridView может сортировать только по одному столбцу, то есть его нельзя сортировать по нескольким столбцам. В практических приложениях сортировка только по одному столбцу не может быть выполнена. Третья проблема — это разбиение на страницы GridView. Предопределенное отображение номера страницы разбиения на страницы GridView относительно простое, но в реальных приложениях разбиение на страницы может быть не таким простым, как просто отображение домашней страницы, предыдущей страницы, следующей страницы, последней страницы или числовых номеров страниц. .Должен быть более необходимый переход, номер текущей страницы, общее количество страниц и т. д., более подробная информация.
Во-первых: сортировка по нескольким столбцам и отображение значков сортировки.
Сначала мы можем создать новую программу библиотеки классов. Нам в основном нужно сослаться на файл System.Web.Dll, а затем создать новый класс, который наследует элемент управления GridView. Только нужно переструктурировать некоторые методы.
В примере моей демонстрации используется сортировка по одному столбцу. Если включена сортировка по нескольким столбцам, установите для параметра AllowMultiColumnSorting элемента управления значение True, чтобы добиться сортировки по нескольким столбцам.
1 общедоступный класс WebGridView:GridView
2 {
3 атрибута#атрибуты региона
4 /**//// <сводка>
5 /// Включить или отключить сортировку по нескольким столбцам
6 /// </сводка>
7 [
8 Описание("Включить ли функцию сортировки по нескольким столбцам"),
9 Категория("Сортировка"),
10 Значение по умолчанию («ложь»),
11 ]
12 public bool AllowMultiColumnSorting
13 {
14 получить
15 {
16 объект o = ViewState["EnableMultiColumnSorting"];
17 return (o != null ? (bool)o : false);
18}
19 комплектов
20 {
21 АлловСортинг = истина;
22 ViewState["EnableMultiColumnSorting"] = значение;
двадцать три }
двадцать четыре }
25 /**//// <краткое содержание>
26 /// Отображение значка в порядке возрастания
27 /// </summary>
28 [
29 Описание("Показывать значок при сортировке по возрастанию"),
30 Категория("Сортировка"),
31 Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
32 Значение по умолчанию(""),
33
34 ]
35 общедоступная строка SortAscImageUrl
36 {
37 получить
38 {
39 объект o = ViewState["SortImageAsc"];
40 return (o != null ? o.ToString() : "");
41 }
42 комплекта
43 {
44 ViewState["SortImageAsc"] = значение;
45 }
46 }
47 /**//// <краткое содержание>
48 /// Отображение значков в порядке убывания
49 /// </summary>
50 [
51 Описание("Показать значок в порядке убывания"),
52 Категория("Сортировка"),
53 Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
54 Значение по умолчанию(""),
55 ]
56 общедоступная строка SortDescImageUrl
57 {
58 получить
59 {
60 объект o = ViewState["SortImageDesc"];
61 return (o != null ? o.ToString() : "");
62 }
63 комплекта
64 {
65 ViewState["SortImageDesc"] = значение;
66 }
67 }
68 #конецрегиона
69 Метод переопределения#регион Метод переопределения
70 защищенное переопределение void OnSorting (GridViewSortEventArgs e)
71 {
72, если (Алловмультиколонковая сортировка)
73 {
74 e.SortExpression = GetSortExpression(e);
75 }
76
77 base.OnSorting(e);
78 }
79 защищенное переопределение void OnRowCreated (GridViewRowEventArgs e)
80 {
81 if (e.Row.RowType == DataControlRowType.Header)
82 {
83 if (ВыражениеСортировки!= 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 #конецрегиона
92 защищенный метод #защищенный метод области
93 /**//// <краткое содержание>
94 /// Получить выражение сортировки
95 /// </summary>
96 защищенная строка GetSortExpression (GridViewSortEventArgs e)
97 {
98 строка [] sortColumns = ноль;
99 строка sortAttribute = Выражение Сортировки;
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
110 {
111 sortAttribute += String.Concat(",", e.SortExpression, "ASC");
112 }
113 return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115 }
116 /**//// <сводка>
117 /// Изменить порядок сортировки
118 /// </summary>
119 защищенная строка ModifySortExpression(string[] sortColumns, string sortExpression)
120 {
121 строка ascSortExpression = String.Concat(sortExpression, "ASC");
122 string descSortExpression = String.Concat(sortExpression, "DESC");
123
124 для (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 /**//// <сводка>
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 = я + 1;
153, если (Алловмультиколонковая сортировка)
154 {
155 sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
156 }
еще 157
158 {
159 sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
160 }
161 }
162 }
163 }
164 /**//// <краткое содержание>
165 /// Рисуем картинки в порядке возрастания и убывания.
166 /// </summary>
167 protected void DisplaySortOrderImages (string sortExpression, GridViewRow dgItem)
168 {
169 string[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171 для (int i = 0; i < dgItem.Cells.Count; i++)
172 {
173 if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] — это LinkButton)
174 {
175 строка sortOrder;
176 int sortOrderNo;
177 строковый столбец = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178 SearchSortExpression (sortColumns, столбец, выход sortOrder, выход sortOrderNo);
179, если (sortOrderNo > 0)
180 {
181 строка sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl: SortDescImageUrl);
182
183 if (sortImgLoc != String.Empty)
184 {
185 Изображение imgSortDirection = новое изображение();
186 imgSortDirection.ImageUrl = sortImgLoc;
187 dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189 }
еще 190
191 {
192
193, если (Алловмультиколонковая сортировка)
194 {
195 ЛитералlitSortSeq = новый Литерал();
196litSortSeq.Text = sortOrderNo.ToString();
197 dgItem.Cells[i].Controls.Add(litSortSeq);
198
199 }
200 }
201 }
202 }
203 }
204
205 }
206 #конецрегиона
207 }
Второе: отображение подробной информации о страницах. Эта функция не инкапсулирована в форму управления. Вы можете напрямую управлять последней страницей в событии GridView_DataBound.
Ниже приведена демонстрация кода сортировки по нескольким столбцам и отображения страниц.
<script runat="сервер">
void PageDropDownList_SelectedIndexChanged (отправитель объекта, EventArgs e)
{
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex;
}
void CustomersGridView_DataBound (отправитель объекта, 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 = ложь;
linkBtnPrev.Enabled = ложь;
}
иначе, если (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
{
linkBtnLast.Enabled = ложь;
linkBtnNext.Enabled = ложь;
}
иначе, если (CustomersGridView.PageCount<=0)
{
linkBtnFirst.Enabled = ложь;
linkBtnPrev.Enabled = ложь;
linkBtnNext.Enabled = ложь;
linkBtnLast.Enabled = ложь;
}
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
Метка pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel"
if (pageList != null)
{
for (int i = 0; i < CustomersGridView.PageCount; i++)
{
int pageNumber = я + 1;
Элемент ListItem = новый ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
если (я == CustomersGridView.PageIndex)
{
элемент.Выбранный = правда;
}
pageList.Items.Add
(элемент)
;
если (pageLabel!= ноль)
{
int currentPage = CustomersGridView.PageIndex + 1;
pageLabel.Text = "Текущая страница: " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
}
}
</script>
<html>
<тело>
<form id="Form1" runat="server">
<h3>
Пример шаблона страницы GridView</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" />
<ПейджерШаблон>
<ширина таблицы="100%">
<тр>
<td width="70%">
<asp:Label ID="MessageLabel" ForeColor="Blue" Text="Номер страницы:" runat="server" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="сервер" />
<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>
</таблица>
</ПейджерТемплате>
</asp:WebGridView>
<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="Выберите [CustomerID], [CompanyName], [Адрес], [Город], [Почтовый индекс], [Страну] от [Клиенты]"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="server">
</asp:SqlDataSource>
</form>
</тело>
</html>