เมื่อเร็วๆ นี้เมื่อใช้ตัวควบคุม GridView ของ ASP.net 2.0 ฉันพบว่าฟังก์ชันการเรียงลำดับและเพจที่ Microsoft นำมาใช้นั้นง่ายมาก ตัวอย่างเช่น การเรียงลำดับจะทริกเกอร์ PostBack ของทั้งหน้าเมื่อคลิกที่ชื่อคอลัมน์ จากนั้นจึงเรียงลำดับ ไม่มีใครอยู่บนส่วนหัวของคอลัมน์ การแสดงไอคอนตามลำดับจากน้อยไปหามากจะทำให้ผู้ใช้สับสนเมื่อใช้งานเนื่องจากไม่รู้ว่าเป็นลำดับจากน้อยไปมากหรือจากมากไปหาน้อย ดังนั้นปัญหาแรกที่ต้องแก้ไขในวันนี้คือการแสดงไอคอน ในคอลัมน์จากน้อยไปหามาก ปัญหาที่สองที่ต้องแก้ไขคือ ตามค่าเริ่มต้น GridView สามารถจัดเรียงตามคอลัมน์เดียวเท่านั้น กล่าวคือ ไม่สามารถจัดเรียงตามหลายคอลัมน์ได้ ในการใช้งานจริง การเรียงลำดับตามคอลัมน์เดียวไม่สามารถตอบสนองธุรกิจได้ ปัญหาที่สามคือการแบ่งหน้า GridView การแสดงหมายเลขหน้าเพจที่กำหนดไว้ล่วงหน้าของ GridView ค่อนข้างง่าย แต่ในการใช้งานจริง การเพจอาจไม่ง่ายเหมือนกับการแสดงหน้าแรก หน้าก่อนหน้า หน้าถัดไป หน้าสุดท้าย หรือหมายเลขหน้าตัวเลข ควรข้ามไป, หมายเลขหน้าปัจจุบัน, จำนวนหน้าทั้งหมด ฯลฯ , ข้อมูลรายละเอียดเพิ่มเติม
ขั้นแรก: การแสดงไอคอนการเรียงลำดับและการเรียงลำดับหลายคอลัมน์ของ GridView
ขั้นแรกเราสามารถสร้างโปรแกรมไลบรารีคลาสใหม่ได้ โดยพื้นฐานแล้วเราจำเป็นต้องอ้างอิงไฟล์ System.Web.Dll จากนั้นสร้างคลาสใหม่ ต้องปรับโครงสร้างวิธีการบางอย่างเท่านั้น
ตัวอย่างของการสาธิตของฉันใช้การเรียงลำดับคอลัมน์เดียว หากเปิดใช้งานการเรียงลำดับหลายคอลัมน์ ให้ตั้งค่า AllowMultiColumnSorting ของตัวควบคุมเป็น True เพื่อให้เกิดการเรียงลำดับหลายคอลัมน์
1 คลาสสาธารณะ WebGridView:GridView
2 {
3 คุณลักษณะ#แอตทริบิวต์ภูมิภาค
4 /***//// <สรุป>
5 /// ไม่ว่าจะเปิดหรือปิดการเรียงลำดับหลายคอลัมน์
6 /// </สรุป>
7 [
8 คำอธิบาย("ไม่ว่าจะเปิดใช้งานฟังก์ชันการเรียงลำดับหลายคอลัมน์หรือไม่"),
9 หมวดหมู่("เรียงลำดับ"),
10 ค่าเริ่มต้น("เท็จ"),
11 ]
12 บูลสาธารณะ AllowMultiColumnSorting
13 {
14 ได้รับ
15 {
16 วัตถุ o = ViewState["EnableMultiColumnSorting"];
17 ส่งคืน (o != null ? (บูล)o : false);
18}
19 ชุด
20 {
21 AllowSorting = จริง;
22 ViewState["EnableMultiColumnSorting"] = ค่า;
ยี่สิบสาม }
ยี่สิบสี่ }
25 /***////// <สรุป>
26 /// แสดงไอคอนตามลำดับจากน้อยไปหามาก
27 /// </สรุป>
28 [
29 คำอธิบาย("แสดงไอคอนเมื่อเรียงลำดับจากน้อยไปหามาก"),
30 หมวดหมู่("เรียงลำดับ"),
31 ตัวแก้ไข ("System.Web.UI.Design.UrlEditor", typeof (System. Drawing.Design.UITypeEditor)),
32 ค่าเริ่มต้น(""),
33
34 ]
35 สตริงสาธารณะ SortAscImageUrl
36 {
37 ได้
38 {
39 วัตถุ o = ViewState["SortImageAsc"];
40 กลับ (o != null ? o.ToString() : "");
41 }
42 ชุด
43 {
44 ViewState["SortImageAsc"] = ค่า;
45 }
46 }
47 /***////// <สรุป>
48 /// แสดงไอคอนตามลำดับจากมากไปน้อย
49 /// </สรุป>
50 [
51 คำอธิบาย("แสดงไอคอนตามลำดับจากมากไปน้อย"),
52 หมวดหมู่("เรียงลำดับ"),
53 ตัวแก้ไข ("System.Web.UI.Design.UrlEditor", typeof (System. Drawing.Design.UITypeEditor)),
54 ค่าเริ่มต้น(""),
55 ]
56 สตริงสาธารณะ SortDescImageUrl
57 {
58 ได้
59 {
60 วัตถุ o = ViewState["SortImageDesc"];
61 กลับ (o != null ? o.ToString() : "");
62 }
63 ชุด
64 {
65 ViewState["SortImageDesc"] = ค่า;
66 }
67 }
68#เอนรีเจียน
69 วิธีการแทนที่#ภูมิภาค วิธีการแทนที่
70 การแทนที่การป้องกันเป็นโมฆะ OnSorting (GridViewSortEventArgs e)
71 {
72 ถ้า (AllowMultiColumnSorting)
73 {
74 e.SortExpression = GetSortExpression(e);
75 }
76
77 ฐาน OnSorting(e);
78 }
79 การแทนที่การป้องกันเป็นโมฆะ OnRowCreated (GridViewRowEventArgs e)
80 {
81 ถ้า (e.Row.RowType == DataControlRowType.Header)
82 {
83 ถ้า (SortExpression != String.Empty)
84 {
85 DisplaySortOrderImages (SortExpression, e.Row);
86 นี้.CreateRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
87 }
88}
89 ฐาน OnRowCreated(e);
90}
91 #เขตแดน
92 วิธีการป้องกัน #วิธีป้องกันภูมิภาค
93 /***////// <สรุป>
94 /// รับนิพจน์การเรียงลำดับ
95 /// </สรุป>
96 สตริงที่ได้รับการป้องกัน GetSortExpression (GridViewSortEventArgs e)
97 {
98 สตริง[] sortColumns = null;
99 สตริง sortAttribute = SortExpression;
100
101 ถ้า (sortAttribute != String.Empty)
102 {
103 sortColumns = sortAttribute.Split(",".ToCharArray());
104 }
105 ถ้า (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 กลับ sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115 }
116 /***////// <สรุป>
117 /// แก้ไขการเรียงลำดับ
118 /// </สรุป>
119 สตริงที่ได้รับการป้องกัน ModifySortExpression (สตริง [] sortColumns, สตริง sortExpression)
120 {
121 สตริง ascSortExpression = String.Concat(sortExpression, " ASC ");
122 สตริง descSortExpression = String.Concat(sortExpression, " DESC ");
123
124 สำหรับ (int i = 0; i < sortColumns.Length; i++)
125 {
126
127 ถ้า (ascSortExpression.Equals(sortColumns[i]))
128 {
129 sortColumns[i] = เรียงลำดับนิพจน์;
130 }
131
132 อื่น ๆ ถ้า (descSortExpression.Equals(sortColumns[i]))
133 {
134 Array.Clear(เรียงลำดับคอลัมน์, i, 1);
135 }
136 }
137
138 กลับ String.Join(",", sortColumns).แทนที่(",,", ",").TrimStart(",".ToCharArray());
139
140 }
141 //////// <สรุป>
142 /// รับนิพจน์ปัจจุบันเพื่อเรียงลำดับคอลัมน์ที่เลือก
143 /// </สรุป>
144 โมฆะที่ได้รับการป้องกัน SearchSortExpression (สตริง [] sortColumns, สตริง sortColumn, สตริงออก sortOrder, ออก int sortOrderNo)
145 {
146 sortOrder = "";
147 sortOrderNo = -1;
148 สำหรับ (int i = 0; i < sortColumns.Length; i++)
149 {
150 ถ้า (sortColumns[i].StartsWith(sortColumn))
151 {
152 sortOrderNo = ฉัน + 1;
153 ถ้า (AllowMultiColumnSorting)
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 /// </สรุป>
167 โมฆะที่ได้รับการป้องกัน DisplaySortOrderImages (สตริง sortExpression, GridViewRow dgItem)
168 {
169 string[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171 สำหรับ (int i = 0; i < dgItem.Cells.Count; i++)
172 {
173 ถ้า (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 ถ้า (sortImgLoc != String.Empty)
184 {
185 รูปภาพ imgSortDirection = รูปภาพใหม่ ();
186 imgSortDirection.ImageUrl = sortImgLoc;
187 dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189 }
190 อื่นๆ
191 {
192
193 ถ้า (AllowMultiColumnSorting)
194 {
195 ตัวอักษร litSortSeq = ตัวอักษรใหม่ ();
196 litSortSeq.Text = sortOrderNo.ToString();
197 dgItem.Cells[i].Controls.Add(litSortSeq);
198
199 }
200 }
201 }
202 }
203 }
204
205 }
206 #สิ้นสุดภูมิภาค
207 }
ประการที่สอง: การแสดงข้อมูลเพจโดยละเอียด ฟังก์ชันนี้ไม่ได้ห่อหุ้มไว้ในแบบฟอร์มควบคุม คุณสามารถใช้งานหน้าสุดท้ายในเหตุการณ์ GridView_DataBound ได้โดยตรง
ต่อไปนี้เป็นการสาธิตการเรียงลำดับหลายคอลัมน์และรหัสการแสดงเพจ
<script runat="เซิร์ฟเวอร์">
เป็นโมฆะ PageDropDownList_SelectedIndexChanged (ผู้ส่งวัตถุ EventArgs e)
-
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex;
-
เป็นโมฆะ 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");
ถ้า (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");
ถ้า (pageList != null)
-
สำหรับ (int i = 0; i < CustomersGridView.PageCount; i++)
-
int pageNumber = ฉัน + 1;
รายการรายการ = รายการใหม่ (pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
ถ้า (i == CustomersGridView.PageIndex)
-
item.Selected = จริง;
-
pageList.Items.Add(รายการ
)
;
ถ้า (pageLabel != null)
-
int currentPage = ลูกค้าGridView.PageIndex + 1;
pageLabel.Text = "หน้าปัจจุบัน: " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
-
}
</สคริปต์>
<html>
<ร่างกาย>
<form id="Form1" runat="server">
<h3>
ตัวอย่างเทมเพลต GridView Pager</h3>
<asp:WebGridView ID = "CustomersGridView" DataSourceID = "CustomersSqlDataSource" AutoGenerateColumns = "จริง"
AllowPaging = "true" OnDataBound = "CustomersGridView_DataBound" SortAscImageUrl = "~imagesarrow-up.gif" SortDescImageUrl = "~imagesarrow-down.gif" runat = "เซิร์ฟเวอร์" AllowSorting = "True" width = "723px ">
<PagerStyle ForeColor="สีน้ำเงิน" BackColor="LightBlue" />
<เทมเพลตเพจเจอร์>
<ความกว้างของตาราง="100%">
<tr>
<td width="70%">
<asp:Label ID = "MessageLabel" ForeColor = "สีน้ำเงิน" Text = "หมายเลขหน้า:" runat = "เซิร์ฟเวอร์" />
<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="สีน้ำเงิน" runat="เซิร์ฟเวอร์" />
</td>
</tr>
</ตาราง>
</เทมเพลตเพจเจอร์>
</asp:WebGridView>
<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="เลือก [รหัสลูกค้า], [ชื่อบริษัท], [ที่อยู่], [เมือง], [รหัสไปรษณีย์], [ประเทศ] จาก [ลูกค้า]"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat = "เซิร์ฟเวอร์">
</asp:SqlDataSource>
</ฟอร์ม>
</ร่างกาย>
</html>