Recientemente, cuando utilicé el control GridView de ASP.net 2.0, descubrí que las funciones de clasificación y paginación implementadas por Microsoft son muy simples. Por ejemplo, la clasificación activa la devolución de datos de toda la página al hacer clic en el nombre de la columna y luego ordenar, pero allí. No hay nadie en el encabezado de la columna. Mostrar íconos en orden ascendente y descendente confundirá al usuario final cuando los use porque no sabe si es en orden ascendente o descendente. Entonces, el primer problema que debemos resolver hoy es mostrar los íconos. en la columna en orden ascendente y descendente. De forma predeterminada, GridView solo puede ordenar por una columna, es decir, no se puede ordenar por varias columnas. En aplicaciones prácticas, ordenar por una sola columna no puede cumplir con los negocios. El tercer problema es la paginación GridView. La visualización del número de página de paginación predefinida de GridView es relativamente simple, pero en aplicaciones reales, la paginación puede no ser tan simple como simplemente mostrar la página de inicio, la página anterior, la página siguiente, la última página o los números numéricos de la página. Debería ser más necesario saltar, el número de página actual, el número total de páginas, etc., información más detallada.
Primero: clasificación de varias columnas y visualización del icono de clasificación de GridView.
Primero, podemos crear un nuevo programa de biblioteca de clases. Principalmente necesitamos hacer referencia al archivo System.Web.Dll y luego crear una nueva clase que herede el control GridView. Sólo es necesario reestructurar algunos métodos.
El ejemplo de mi demostración utiliza la clasificación de una sola columna. Si la clasificación de varias columnas está habilitada, establezca AllowMultiColumnSorting del control en True para lograr la clasificación de varias columnas.
1 clase pública WebGridView:GridView
2 {
3 atributos # atributos de región
4 /**//// <resumen>
5 /// Ya sea para habilitar o deshabilitar la clasificación de varias columnas
6 /// </summary>
7 [
8 Descripción ("Si se debe habilitar la función de clasificación de varias columnas"),
9 Categoría("Ordenar"),
10 Valor predeterminado ("falso"),
11 ]
12 bool público AllowMultiColumnSorting
13 {
14 conseguir
15 {
16 objeto o = ViewState["EnableMultiColumnSorting"];
17 retorno (o != nulo ? (bool)o : falso);
18}
19 juegos
20 {
21 Permitir clasificación = verdadero;
22 ViewState["EnableMultiColumnSorting"] = valor;
veintitrés }
veinticuatro}
25 /**//// <resumen>
26 /// Mostrar icono en orden ascendente
27 /// </summary>
28 [
29 Descripción("Mostrar icono al ordenar de forma ascendente"),
30 Categoría("Ordenar"),
31 Editor("System.Web.UI.Design.UrlEditor", tipo de(System.Drawing.Design.UITypeEditor)),
32 Valor predeterminado (""),
33
34 ]
35 cadena pública SortAscImageUrl
36 {
37 conseguir
38 {
39 objeto o = ViewState["SortImageAsc"];
40 retorno (o != nulo ? o.ToString() : "");
41 }
42 juegos
43 {
44 ViewState["SortImageAsc"] = valor;
45 }
46 }
47 /**//// <resumen>
48 /// Mostrar iconos en orden descendente
49 /// </summary>
50 [
51 Descripción("Mostrar icono en orden descendente"),
52 Categoría("Ordenar"),
53 Editor("System.Web.UI.Design.UrlEditor", tipo de(System.Drawing.Design.UITypeEditor)),
54 Valor predeterminado (""),
55 ]
56 cadena pública SortDescImageUrl
57 {
58 obtener
59 {
60 objeto o = ViewState["SortImageDesc"];
61 retorno (o != nulo ? o.ToString() : "");
62 }
63 juegos
64 {
65 ViewState["SortImageDesc"] = valor;
66 }
67 }
68 #endregion
69 Método de reemplazo#región Método de reemplazo
70 anulación protegida void OnSorting(GridViewSortEventArgs e)
71 {
72 si (Permitir clasificación de columnas múltiples)
73 {
74 e.SortExpression = GetSortExpression(e);
75 }
76
77 base.OnSorting(e);
78 }
79 anulación protegida void OnRowCreated (GridViewRowEventArgs e)
80 {
81 si (e.Row.RowType == DataControlRowType.Header)
82 {
83 si (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 método protegido #método protegido de región
93 /**//// <resumen>
94 /// Obtener expresión de clasificación
95 /// </summary>
96 cadena protegida GetSortExpression (GridViewSortEventArgs e)
97 {
98 cadena[] sortColumns = nulo;
99 cadena sortAttribute = SortExpression;
100
101 si (sortAttribute! = String.Empty)
102 {
103 sortColumns = sortAttribute.Split(",".ToCharArray());
104 }
105 si (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
106 {
107 sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
108 }
109 más
110 {
111 sortAttribute += String.Concat(",", e.SortExpression, "ASC");
112 }
113 retorno sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115 }
116 /**//// <resumen>
117 /// Modificar orden de clasificación
118 /// </summary>
119 cadena protegida ModifySortExpression(string[] sortColumns, string sortExpression)
120 {
121 cadena ascSortExpression = String.Concat(sortExpression, "ASC");
122 cadena descSortExpression = String.Concat(sortExpression, "DESC");
123
124 para (int i = 0; i < sortColumns.Length; i++)
125 {
126
127 si (ascSortExpression.Equals(sortColumns[i]))
128 {
129 ordenarColumnas[i] = descSortExpression;
130 }
131
132 más si (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 /**//// <resumen>
142 /// Obtener la expresión actual para ordenar la columna seleccionada
143 /// </summary>
144 void protegido SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
145 {
146 ordenarOrden = "";
147 sortOrderNo = -1;
148 para (int i = 0; i < sortColumns.Length; i++)
149 {
150 si (sortColumns[i].StartsWith(sortColumn))
151 {
152 sortOrderNo = i + 1;
153 si (Permitir clasificación de columnas múltiples)
154 {
155 sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
156 }
157 más
158 {
159 sortOrder = ((SortDirection == SortDirection.Ascending)? "ASC" : "DESC");
160 }
161 }
162 }
163 }
164 /**//// <resumen>
165 /// Haz dibujos en orden ascendente y descendente
166 /// </summary>
167 DisplaySortOrderImages vacío protegido (cadena sortExpression, GridViewRow dgItem)
168 {
169 cadena[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171 para (int i = 0; i < dgItem.Cells.Count; i++)
172 {
173 si (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] es LinkButton)
174 {
Orden de clasificación de 175 cadenas;
176 int sortOrdenNo;
177 columna de cadena = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178 SearchSortExpression(sortColumns, columna, out sortOrder, out sortOrderNo);
179 si (sortOrderNo > 0)
180 {
181 cadena sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl: SortDescImageUrl);
182
183 si (sortImgLoc! = String.Empty)
184 {
185 Imagen imgSortDirection = nueva Imagen();
186 imgSortDirection.ImageUrl = sortImgLoc;
187 dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189 }
190 más
191 {
192
193 si (Permitir clasificación de columnas múltiples)
194 {
195 Literal litSortSeq = nuevo Literal();
196 litSortSeq.Text = sortOrderNo.ToString();
197 dgItem.Cells[i].Controls.Add(litSortSeq);
198
199 }
200 }
201 }
202 }
203 }
204
205 }
206 #endregion
207 }
Segundo: visualización de información de paginación detallada. Esta función no está encapsulada en un formulario de control. Puede operar directamente la última página en el evento GridView_DataBound.
La siguiente es una demostración del código de visualización de paginación y clasificación de varias columnas.
<script runat="servidor">
void PageDropDownList_SelectedIndexChanged (remitente del objeto, EventArgs e)
{
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex;
}
void CustomersGridView_DataBound (remitente del objeto, 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 = falso;
linkBtnPrev.Enabled = falso;
}
de lo contrario si (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
{
linkBtnLast.Enabled = falso;
linkBtnNext.Enabled = falso;
}
de lo contrario si (CustomersGridView.PageCount<=0)
{
linkBtnFirst.Enabled = falso;
linkBtnPrev.Enabled = falso;
linkBtnNext.Enabled = falso;
linkBtnLast.Enabled = falso;
}
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
Etiqueta pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel")
;
{
para (int i = 0; i < CustomersGridView.PageCount; i++)
{
int número de página = i + 1;
Elemento ListItem = nuevo ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
si (i == ClientesGridView.PageIndex)
{
item.Selected = verdadero;
}
pageList.Items.Add(elemento);
}
}
si (etiqueta de página! = nulo)
{
int currentPage = ClientesGridView.PageIndex + 1;
pageLabel.Text = "Página actual: " + currentPage.ToString() +
" / " + ClientesGridView.PageCount.ToString();
}
}
</script>
<html>
<cuerpo>
<form id="Form1" runat="servidor">
<h3>
Ejemplo de plantilla de paginación GridView</h3>
<asp:WebGridView ID="ClientesGridView" DataSourceID="ClientesSqlDataSource" AutoGenerateColumns="true"
AllowPaging="true" OnDataBound="CustomersGridView_DataBound" SortAscImageUrl="~imagesarrow-up.gif" SortDescImageUrl="~imagesarrow-down.gif" runat="servidor" AllowSorting="True" Ancho="723px ">
<PagerStyle ForeColor="Azul" BackColor="Azul claro" />
<Plantilla de buscapersonas>
<ancho de tabla="100%">
<tr>
<td ancho="70%">
<asp:Label ID="MessageLabel" ForeColor="Blue" Text="Número de página:" runat="servidor" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="servidor" />
<asp:LinkButton CommandName="Página" CommandArgument="Primero" ID="linkBtnFirst" runat="servidor">Inicio</asp:LinkButton>
<asp:LinkButton CommandName="Página" CommandArgument="Prev" ID="linkBtnPrev" runat="server">Página anterior</asp:LinkButton>
<asp:LinkButton CommandName="Página" CommandArgument="Siguiente" ID="linkBtnNext" runat="server">Página siguiente</asp:LinkButton>
<asp:LinkButton CommandName="Página" CommandArgument="Last" ID="linkBtnLast" runat="server">Última página</asp:LinkButton>
</td>
<td ancho="70%" align="right">
<asp:Label ID="CurrentPageLabel" ForeColor="Azul" runat="servidor" />
</td>
</tr>
</tabla>
</PagerTemplate>
</asp:WebGridView>
<asp:SqlDataSource ID="ClientesSqlDataSource" SelectCommand="Seleccione [ID de cliente], [Nombre de la empresa], [Dirección], [Ciudad], [Código postal], [País] de [Clientes]"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="servidor">
</asp:SqlDataSource>
</form>
</cuerpo>
</html>