최근 ASP.net 2.0의 GridView 컨트롤을 사용하면서 Microsoft에서 구현한 정렬 및 페이징 기능이 매우 간단하다는 것을 알았습니다. 예를 들어 정렬은 열 이름을 클릭한 다음 정렬하면 전체 페이지의 PostBack이 트리거되지만 거기에는 오류가 있습니다. 열 헤더에 아무도 없습니다. 아이콘을 오름차순과 내림차순으로 표시하면 최종 사용자가 오름차순인지 내림차순인지 알 수 없기 때문에 혼란을 겪게 됩니다. 따라서 오늘 해결해야 할 첫 번째 문제는 아이콘을 표시하는 것입니다. 두 번째로 해결해야 할 문제는 기본적으로 GridView는 하나의 열로만 정렬할 수 있습니다. 즉, 실제 응용 프로그램에서는 하나의 열로만 정렬할 수 없습니다. 세 번째 문제는 GridView 페이징입니다. GridView 사전 정의된 페이징 페이지 번호 표시는 비교적 간단하지만 실제 애플리케이션에서는 페이징이 단순히 홈 페이지, 이전 페이지, 다음 페이지, 마지막 페이지 또는 숫자 페이지 번호를 표시하는 것만큼 간단하지 않을 수 있습니다. . 점프, 현재 페이지 수, 총 페이지 수 등 더 자세한 정보가 필요합니다.
첫 번째: GridView 다중 열 정렬 및 정렬 아이콘 표시 먼저,
우리는 주로 System.Web.Dll 파일을 참조한 다음 GridView 컨트롤을 상속하는 새 클래스를 만들어야 합니다. 일부 메소드만 재구성하면 됩니다.
내 데모 예에서는 단일 열 정렬을 사용합니다. 다중 열 정렬이 활성화된 경우 컨트롤의 AllowMultiColumnSorting을 True로 설정하여 다중 열 정렬을 수행합니다.
1개의 공개 클래스 WebGridView:GridView
2 {
3개 속성#지역 속성
4 /**//// <요약>
5 /// 다중 열 정렬 활성화 또는 비활성화 여부
6 /// </summary>
7 [
8 Description("다중 정렬 기능 활성화 여부"),
9 카테고리("정렬"),
10 기본값("거짓"),
11]
12 공개 bool AllowMultiColumnSorting
13 {
14 얻다
15 {
16 개체 o = ViewState["EnableMultiColumnSorting"];
17 return (o != null ? (bool)o : false);
18}
19 세트
20 {
21 정렬 허용 = true;
22 ViewState["EnableMultiColumnSorting"] = 값;
스물셋 }
스물넷 }
25 /**//// <요약>
26 /// 아이콘을 오름차순으로 표시
27 /// </summary>
28 [
29 Description("오름차순 정렬 시 아이콘 표시"),
30 카테고리("정렬"),
31 Editor("System.Web.UI.Design.UrlEditor", typeof(System.드로잉.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 Description("내림차순으로 아이콘 표시"),
52 카테고리("정렬"),
53 Editor("System.Web.UI.Design.UrlEditor", typeof(System.드로잉.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 재정의 방법#region 재정의 방법
70 보호된 재정의 void OnSorting(GridViewSortEventArgs e)
71 {
72 if(다중 열 정렬 허용)
73 {
74 e.SortExpression = GetSortExpression(e);
75 }
76
77 베이스.정렬(e);
78 }
79 보호된 재정의 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 베이스.OnRowCreated(e);
90}
91 #끝지역
92 보호된 메소드 #region 보호된 메소드
93 /**//// <요약>
94 /// 정렬 표현식 가져오기
95 /// </summary>
96 보호된 문자열 GetSortExpression(GridViewSortEventArgs e)
97 {
98 문자열[] sortColumns = null;
99 문자열 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개
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 string ascSortExpression = String.Concat(sortExpression, " ASC ");
122 문자열 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 이진수[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 정렬순서 = "";
147 정렬순서번호 = -1;
148 for (int i = 0; i < sortColumns.Length; i++)
149 {
150 if (sortColumns[i].StartsWith(sortColumn))
151 {
152 정렬순서번호 = i + 1;
153 if(다중 열 정렬 허용)
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 보호된 무효 DisplaySortOrderImages(문자열 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]은 LinkButton입니다.)
174 {
175 문자열 정렬순서;
176 int sortOrderNo;
177 문자열 열 = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178 SearchSortExpression(sortColumns, 열, out sortOrder, out sortOrderNo);
179 if (sortOrderNo > 0)
180 {
181 문자열 sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
182
183 if (sortImgLoc != 문자열.비어 있음)
184 {
185 이미지 imgSortDirection = new Image();
186 imgSortDirection.ImageUrl = 정렬ImgLoc;
187 dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189 }
그 외 190개
191 {
192
193 if(다중 열 정렬 허용)
194 {
195 리터럴 litSortSeq = new Literal();
196 litSortSeq.Text = sortOrderNo.ToString();
197 dgItem.Cells[i].Controls.Add(litSortSeq);
198
199 }
200 }
201 }
202 }
203 }
204
205 }
206 #끝지역
207 }
둘째: 자세한 페이징 정보 표시입니다. 이 기능은 컨트롤 형식으로 캡슐화되지 않습니다. GridView_DataBound 이벤트에서 마지막 페이지를 직접 조작할 수 있습니다.
다음은 다중 열 정렬 및 페이징 표시 코드의 데모입니다.
<스크립트 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 = false;
linkBtnPrev.Enabled = 거짓;
}
그렇지 않으면 (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
{
linkBtnLast.Enabled = 거짓;
linkBtnNext.Enabled = 거짓;
}
그렇지 않으면 (CustomersGridView.PageCount<=0)
{
linkBtnFirst.Enabled = false;
linkBtnPrev.Enabled = 거짓;
linkBtnNext.Enabled = 거짓;
linkBtnLast.Enabled = 거짓;
}
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 페이지번호 = i + 1;
ListItem 항목 = new ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
if (i == CustomersGridView.PageIndex)
{
항목.선택됨 = true;
}
pageList.Items.Add(항목)
}
}
if(페이지라벨 != null)
{
int currentPage = CustomersGridView.PageIndex + 1;
pageLabel.Text = "현재 페이지: " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
}
}
</script>
<html>
<본문>
<form id="Form1" runat="서버">
<h3>
GridView PagerTemplate 예</h3>
<asp:WebGridView ID="CustomersGridView" DataSourceID="CustomersSqlDataSource" AutoGenerateColumns="true"
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 너비="70%">
<asp:Label ID="MessageLabel" ForeColor="Blue" Text="페이지 번호:" runat="server" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="서버" />
<asp:LinkButton CommandName="페이지" 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="페이지" CommandArgument="Last" ID="linkBtnLast" runat="server">마지막 페이지</asp:LinkButton>
</td>
<td 너비="70%" 정렬="오른쪽">
<asp:Label ID="CurrentPageLabel" ForeColor="Blue" runat="server" />
</td>
</tr>
</table>
</PagerTemplate>
</asp:WebGridView>
<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="[고객]에서 [고객 ID], [회사 이름], [주소], [도시], [우편 번호], [국가] 선택"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="서버">
</asp:SqlDataSource>
</form>
</body>
</html>