Récemment, en utilisant le contrôle GridView d'ASP.net 2.0, j'ai constaté que les fonctions de tri et de pagination implémentées par Microsoft sont très simples. Par exemple, le tri déclenche la publication de la page entière lorsque l'on clique sur le nom de la colonne, puis le tri, mais là. Il n'y a personne sur l'en-tête de colonne. L'affichage des icônes par ordre croissant et décroissant va dérouter l'utilisateur final lors de leur utilisation car il ne sait pas s'il s'agit d'un ordre croissant ou décroissant. Le premier problème à résoudre aujourd'hui est donc d'afficher les icônes. sur la colonne par ordre croissant et décroissant. Le deuxième problème à résoudre est que par défaut, GridView ne peut trier que sur une seule colonne, c'est-à-dire qu'il ne peut pas être trié sur plusieurs colonnes. Dans les applications pratiques, le tri sur une seule colonne ne peut pas répondre aux besoins. Le troisième problème est la pagination GridView. L'affichage du numéro de page de pagination prédéfini par GridView est relativement simple, mais dans les applications réelles, la pagination peut ne pas être aussi simple que l'affichage de la page d'accueil, de la page précédente, de la page suivante, de la dernière page ou des numéros de page numériques. . Il devrait être plus nécessaire de sauter, le numéro de page actuel, le nombre total de pages, etc., des informations plus détaillées.
Premièrement : affichage de l'icône de tri et de tri multi-colonnes GridView.
Tout d'abord, nous pouvons créer un nouveau programme de bibliothèque de classes. Nous devons principalement référencer le fichier System.Web.Dll, puis créer une nouvelle classe. Cette classe hérite du contrôle GridView. il suffit de restructurer certaines méthodes.
L'exemple de ma démonstration utilise le tri sur une seule colonne. Si le tri sur plusieurs colonnes est activé, définissez AllowMultiColumnSorting du contrôle sur True pour obtenir un tri sur plusieurs colonnes.
1 classe publique WebGridView:GridView
2 {
3 attributs#attributs de région
4 /**//// <résumé>
5 /// Activer ou désactiver le tri multi-colonnes
6 /// </summary>
7 [
8 Description("S'il faut activer la fonction de tri multi-colonnes"),
9 Catégorie("Trier"),
10 Valeur par Défaut("faux"),
11 ]
12 public bool AllowMultiColumnSorting
13 {
14 obtenir
15 {
16 objet o = ViewState["EnableMultiColumnSorting"];
17 return (o != null ? (bool)o : false);
18}
19 ensembles
20 {
21 AllowSorting = vrai ;
22 ViewState["EnableMultiColumnSorting"] = valeur ;
vingt-trois }
vingt-quatre }
25 /**//// <résumé>
26 /// Afficher l'icône par ordre croissant
27 /// </summary>
28 [
29 Description("Afficher l'icône lors du tri croissant"),
30 Catégorie("Trier"),
31 Éditeur("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
32 Valeur par Défaut(""),
33
34 ]
35 chaîne publique SortAscImageUrl
36 {
37 obtenir
38 {
39 objet o = ViewState["SortImageAsc"];
40 return (o != null ? o.ToString() : "");
41 }
42 ensembles
43 {
44 ViewState["SortImageAsc"] = valeur ;
45 }
46 }
47 /**//// <résumé>
48 /// Afficher les icônes par ordre décroissant
49 /// </summary>
50 [
51 Description("Afficher l'icône par ordre décroissant"),
52 Catégorie("Trier"),
53 Éditeur("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
54 Valeur par Défaut(""),
55 ]
56 chaîne publique SortDescImageUrl
57 {
58 obtenir
59 {
60 objet o = ViewState["SortImageDesc"];
61 return (o != null ? o.ToString() : "");
62 }
63 ensembles
64 {
65 ViewState["SortImageDesc"] = valeur ;
66 }
67 }
68 #endregion
69 Méthode de remplacement#region Méthode de remplacement
70 remplacement protégé void OnSorting (GridViewSortEventArgs e)
71 {
72 si (Autoriser le tri multicolonnes)
73 {
74 e.SortExpression = GetSortExpression(e);
75 }
76
77 base.OnSorting(e);
78 }
79 remplacement protégé 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éthode protégée #region méthode protégée
93 /**//// <résumé>
94 /// Obtenir l'expression de tri
95 /// </summary>
96 chaîne protégée GetSortExpression(GridViewSortEventArgs e)
97 {
98 string[] sortColumns = null;
99 chaîne 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 autres
110 {
111 sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
112 }
113 return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115 }
116 /**//// <résumé>
117 /// Modifier l'ordre de tri
118 /// </summary>
119 chaîne protégée ModifySortExpression(string[] sortColumns, string sortExpression)
120 {
121 chaîne ascSortExpression = String.Concat(sortExpression, " ASC ");
122 chaîne descSortExpression = String.Concat(sortExpression, " DESC ");
123
124 pour (int i = 0; i < sortColumns.Length; i++)
125 {
126
127 si (ascSortExpression.Equals(sortColumns[i]))
128 {
129 sortColumns[i] = descSortExpression;
130 }
131
132 sinon 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 /**//// <résumé>
142 /// Récupère l'expression actuelle pour trier la colonne sélectionnée
143 /// </summary>
144 protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
145 {
146 ordre de tri = "";
147 sortOrderNo = -1 ;
148 pour (int i = 0; i < sortColumns.Length; i++)
149 {
150 si (sortColumns[i].StartsWith(sortColumn))
151 {
152 sortOrderNo = i + 1 ;
153 si (Autoriser le tri multicolonnes)
154 {
155 sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
156 }
157 autres
158 {
159 sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
160 }
161 }
162 }
163 }
164 /**//// <résumé>
165 /// Dessinez des images par ordre croissant et décroissant
166 /// </summary>
167 void protégé DisplaySortOrderImages (string sortExpression, GridViewRow dgItem)
168 {
169 string[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171 pour (int i = 0; i < dgItem.Cells.Count; i++)
172 {
173 si (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] est LinkButton)
174 {
175 chaîne sortOrder ;
176 int sortOrderNo ;
177 chaîne colonne = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178 SearchSortExpression (sortColumns, colonne, sortie sortOrder, sortie sortOrderNo);
179 si (sortOrderNo > 0)
180 {
181 chaîne sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
182
183 si (sortImgLoc != String.Empty)
184 {
185 Image imgSortDirection = new Image();
186 imgSortDirection.ImageUrl = sortImgLoc;
187 dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189 }
190 autres
191 {
192
193 si (Autoriser le tri multicolonnes)
194 {
195 Littéral 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 }
Deuxièmement : affichage d'informations de pagination détaillées. Cette fonction n'est pas encapsulée dans un formulaire de contrôle. Vous pouvez directement utiliser la dernière page de l'événement GridView_DataBound.
Ce qui suit est une démonstration du code d'affichage de tri et de pagination multi-colonnes
<script runat="serveur">
void PageDropDownList_SelectedIndexChanged (expéditeur d'objet, EventArgs e)
{
GridViewRow pagerRow = CustomersGridView.BottomPagerRow ;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex ;
}
void CustomersGridView_DataBound (expéditeur d'objet, 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 ;
}
sinon si (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
{
linkBtnLast.Enabled = false ;
linkBtnNext.Enabled = false ;
}
sinon si (CustomersGridView.PageCount<=0)
{
linkBtnFirst.Enabled = false ;
linkBtnPrev.Enabled = false ;
linkBtnNext.Enabled = false ;
linkBtnLast.Enabled = false ;
}
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
Étiquette pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
if (pageList != null)
{
pour (int i = 0; i < CustomersGridView.PageCount; i++)
{
int numéro de page = i + 1 ;
Élément ListItem = new ListItem (pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
si (i == CustomersGridView.PageIndex)
{
item.Selected = vrai;
}
pageList.Items.Add(élément);
}
}
si (pageLabel != null)
{
int currentPage = CustomersGridView.PageIndex + 1 ;
pageLabel.Text = "Page actuelle : " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
}
}
</script>
<html>
<corps>
<form id="Form1" runat="serveur">
<h3>
Exemple de modèle de pager 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" Largeur="723px ">
<PagerStyle ForeColor="Bleu" BackColor="Bleu Clair" />
<Modèle de pager>
<largeur du tableau="100%">
<tr>
<td largeur="70%">
<asp:Label ID="MessageLabel" ForeColor="Blue" Text="Numéro de page :" runat="server" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="serveur" />
<asp:LinkButton CommandName="Page" CommandArgument="First" ID="linkBtnFirst" runat="server">Accueil</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Prev" ID="linkBtnPrev" runat="server">Page précédente</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Next" ID="linkBtnNext" runat="server">Page suivante</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Last" ID="linkBtnLast" runat="server">Dernière page</asp:LinkButton>
</td>
<td width="70%" align="right">
<asp:Label ID="CurrentPageLabel" ForeColor="Blue" runat="server" />
</td>
</tr>
</table>
</Modèle de page>
</asp:WebGridView>
<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="Sélectionnez [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Clients]"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="server">
</asp:SqlDataSource>
</form>
</corps>
</html>