1Using directives#region Using directives
2
3using System;
4using System.Collections.Generic;
5using System.ComponentModel;
6using System.Text;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9
10#endregion
11
12namespace GridControl
13{
14
15 public class ctGridView: GridView
16 {
17 Properties#region Properties
18 /**//// <summary>
19 /// Enable/Disable MultiColumn Sorting.
20 /// </summary>
21 [
22 Description("Whether Sorting On more than one column is enabled"),
23 Category("Behavior"),
24 DefaultValue("false"),
25 ]
26 public bool AllowMultiColumnSorting
27 {
28 get
29 {
30 object o = ViewState["EnableMultiColumnSorting"];
31 return (o != null ? (bool)o : false);
32 }
33 set
34 {
35 AllowSorting = true;
36 ViewState["EnableMultiColumnSorting"] = value;
37 }
38 }
39 /**//// <summary>
40 /// Get or Set Image location to be used to display Ascending Sort order.
41 /// </summary>
42 [
43 Description("Image to display for Ascending Sort"),
44 Category("Misc"),
45 Editor("System.Web.UI.Design.UrlEditor",typeof(System.Drawing.Design.UITypeEditor)),
46 DefaultValue(""),
47
48 ]
49 public string SortAscImageUrl
50 {
51 get
52 {
53 object o = ViewState["SortImageAsc"];
54 return (o != null ? o.ToString() : "");
55 }
56 set
57 {
58 ViewState["SortImageAsc"] = value;
59 }
60 }
61 /**//// <summary>
62 /// Get or Set Image location to be used to display Ascending Sort order.
63 /// </summary>
64 [
65 Description("Image to display for Descending Sort"),
66 Category("Misc"),
67 Editor("System.Web.UI.Design.UrlEditor",typeof(System.Drawing.Design.UITypeEditor)),
68 DefaultValue(""),
69 ]
70 public string SortDescImageUrl
71 {
72 get
73 {
74 object o = ViewState["SortImageDesc"];
75 return (o != null ? o.ToString() : "");
76 }
77 set
78 {
79 ViewState["SortImageDesc"] = value;
80 }
81 }
82 #endregion
83 Life Cycle#region Life Cycle
84
85
86 protected override void OnSorting(GridViewSortEventArgs e)
87 {
88 if (AllowMultiColumnSorting)
89 e.SortExpression = GetSortExpression(e);
90
91 base.OnSorting(e);
92 }
93
94 protected override void OnRowCreated(GridViewRowEventArgs e)
95 {
96 if (e.Row.RowType == DataControlRowType.Header)
97 {
98 if (SortExpression != String.Empty)
99 DisplaySortOrderImages(SortExpression, e.Row);
100 }
101 base.OnRowCreated(e);
102 }
103
104 #endregion
105 Protected Methods#region Protected Methods
106 /**//// <summary>
107 /// Get Sort Expression by Looking up the existing Grid View Sort Expression
108 /// </summary>
109 protected string GetSortExpression(GridViewSortEventArgs e)
110 {
111 string[] sortColumns = null;
112 string sortAttribute = SortExpression;
113
114 //Check to See if we have an existing Sort Order already in the Grid View.
115 //If so get the Sort Columns into an array
116 if (sortAttribute != String.Empty)
117 {
118 sortColumns = sortAttribute.Split(",".ToCharArray());
119 }
120
121 //if User clicked on the columns in the existing sort sequence.
122 //Toggle the sort order or remove the column from sort appropriately
123
124 if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
125 sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
126 else
127 sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
128 return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray()) ;
129
130 }
131 /**//// <summary>
132 /// Toggle the sort order or remove the column from sort appropriately
133 /// </summary>
134 protected string ModifySortExpression(string[] sortColumns, string sortExpression)
135 {
136
137 string ascSortExpression = String.Concat(sortExpression, " ASC ");
138 string descSortExpression = String.Concat(sortExpression, " DESC ");
139
140 for (int i = 0; i < sortColumns.Length; i++)
141 {
142
143 if (ascSortExpression.Equals(sortColumns[i]))
144 {
145 sortColumns[i] = descSortExpression;
146 }
147
148 else if (descSortExpression.Equals(sortColumns[i]))
149 {
150 Array.Clear(sortColumns, i, 1);
151 }
152 }
153
154 return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
155
156 }
157 /**//// <summary>
158 /// Lookup the Current Sort Expression to determine the Order of a specific item.
159 /// </summary>
160 protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
161 {
162 sortOrder = "";
163 sortOrderNo = -1;
164 for (int i = 0; i < sortColumns.Length; i++)
165 {
166 if (sortColumns[i].StartsWith(sortColumn))
167 {
168 sortOrderNo = i + 1;
169 if (AllowMultiColumnSorting)
170 sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
171 else
172 sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
173 }
174 }
175 }
176 /**//// <summary>
177 /// Display a graphic image for the Sort Order along with the sort sequence no.
178 /// </summary>
179 protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
180 {
181 string[] sortColumns = sortExpression.Split(",".ToCharArray());
182
183 for (int i = 0; i < dgItem.Cells.Count; i++)
184 {
185 if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
186 {
187 string sortOrder;
188 int sortOrderNo;
189 string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
190 SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
191 if (sortOrderNo > 0)
192 {
193 string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
194
195 if (sortImgLoc != String.Empty)
196 {
197 Image imgSortDirection = new Image();
198 imgSortDirection.ImageUrl = sortImgLoc;
199 dgItem.Cells[i].Controls.Add(imgSortDirection);
200 Label lblSortOrder = new Label();
201 lblSortOrder.Font.Size = FontUnit.Small;
202 lblSortOrder.Text = sortOrderNo.ToString();
203 dgItem.Cells[i].Controls.Add(lblSortOrder);
204
205 }
206 else
207 {
208
209 Label lblSortDirection = new Label();
210 lblSortDirection.Font.Size = FontUnit.XSmall;
211 lblSortDirection.Font.Name = "webdings";
212 lblSortDirection.EnableTheming = false;
213 lblSortDirection.Text = (sortOrder.Equals("ASC") ? "5" : "6");
214 dgItem.Cells[i].Controls.Add(lblSortDirection);
215
216 if (AllowMultiColumnSorting)
217 {
218 Literal litSortSeq = new Literal();
219 litSortSeq.Text = sortOrderNo.ToString();
220 dgItem.Cells[i].Controls.Add(litSortSeq);
221
222 }
223
224
225 }
226
227
228
229
230 }
231
232 }
233 }
234
235 }
236 #endregion
237 }
238}
但是感覺很不爽
以下是一些相关的資料
http://aspnet.4guysfromrolla.com/demos/dgExample37.aspx
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconsortingfilteringdatausingdataview.asp
http://dotnetjunkies.com/WebLog/thomasswilliams/archive/2005/11/09/133667.aspx
http://aspalliance.com/666