1

Using directives#region Using directives2

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
#endregion11

12
namespace GridControl13


{14
15
public class ctGridView: GridView16

{17

Properties#region Properties18

/**//// <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 AllowMultiColumnSorting27

{28
get29

{30
object o = ViewState["EnableMultiColumnSorting"];31
return (o != null ? (bool)o : false);32
}33
set34

{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 SortAscImageUrl50

{51
get52

{53
object o = ViewState["SortImageAsc"];54
return (o != null ? o.ToString() : "");55
}56
set57

{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 SortDescImageUrl71

{72
get73

{74
object o = ViewState["SortImageDesc"];75
return (o != null ? o.ToString() : "");76
}77
set78

{79
ViewState["SortImageDesc"] = value;80
}81
}82
#endregion83

Life Cycle#region Life Cycle84

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
#endregion105

Protected Methods#region Protected Methods106

/**//// <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 array116
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 appropriately123

124
if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))125
sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);126
else127
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 appropriately133
/// </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
else172
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
else207

{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
#endregion237
}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