代碼如下:
1
Using directives#region Using directives
2
3
using System;
4
using System.Collections.Generic;
5
using System.ComponentModel;
6
using System.Text;
7
using System.Web.UI;
8
using System.Web.UI.WebControls;
9
10
#endregion
11
12
namespace 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
转载于:https://www.cnblogs.com/cnaspnet/archive/2006/08/25/486275.html