根据老外的方法,GridVew实现多列排序.
代碼如下:
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1![](/Images/OutliningIndicators/ContractedBlock.gif)
Using directives#region Using directives
2![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
10
#endregion
11![](/Images/OutliningIndicators/None.gif)
12
namespace GridControl
13![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
14
15
public class ctGridView: GridView
16![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
17![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Properties#region Properties
18![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
28
get
29![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30
object o = ViewState["EnableMultiColumnSorting"];
31
return (o != null ? (bool)o : false);
32
}
33
set
34![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
35
AllowSorting = true;
36
ViewState["EnableMultiColumnSorting"] = value;
37
}
38
}
39![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
51
get
52![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
53
object o = ViewState["SortImageAsc"];
54
return (o != null ? o.ToString() : "");
55
}
56
set
57![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
ViewState["SortImageAsc"] = value;
59
}
60
}
61![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
get
73![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
74
object o = ViewState["SortImageDesc"];
75
return (o != null ? o.ToString() : "");
76
}
77
set
78![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
79
ViewState["SortImageDesc"] = value;
80
}
81
}
82
#endregion
83![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Life Cycle#region Life Cycle
84![](/Images/OutliningIndicators/InBlock.gif)
85![](/Images/OutliningIndicators/InBlock.gif)
86
protected override void OnSorting(GridViewSortEventArgs e)
87![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
88
if (AllowMultiColumnSorting)
89
e.SortExpression = GetSortExpression(e);
90
91
base.OnSorting(e);
92
}
93![](/Images/OutliningIndicators/InBlock.gif)
94
protected override void OnRowCreated(GridViewRowEventArgs e)
95![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
96
if (e.Row.RowType == DataControlRowType.Header)
97![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
98
if (SortExpression != String.Empty)
99
DisplaySortOrderImages(SortExpression, e.Row);
100
}
101
base.OnRowCreated(e);
102
}
103
104
#endregion
105![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Protected Methods#region Protected Methods
106![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
107
/// Get Sort Expression by Looking up the existing Grid View Sort Expression
108
/// </summary>
109
protected string GetSortExpression(GridViewSortEventArgs e)
110![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
111
string[] sortColumns = null;
112
string sortAttribute = SortExpression;
113![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
118
sortColumns = sortAttribute.Split(",".ToCharArray());
119
}
120![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
130
}
131![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
132
/// Toggle the sort order or remove the column from sort appropriately
133
/// </summary>
134
protected string ModifySortExpression(string[] sortColumns, string sortExpression)
135![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
136![](/Images/OutliningIndicators/InBlock.gif)
137
string ascSortExpression = String.Concat(sortExpression, " ASC ");
138
string descSortExpression = String.Concat(sortExpression, " DESC ");
139![](/Images/OutliningIndicators/InBlock.gif)
140
for (int i = 0; i < sortColumns.Length; i++)
141![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
142![](/Images/OutliningIndicators/InBlock.gif)
143
if (ascSortExpression.Equals(sortColumns[i]))
144![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
145
sortColumns[i] = descSortExpression;
146
}
147![](/Images/OutliningIndicators/InBlock.gif)
148
else if (descSortExpression.Equals(sortColumns[i]))
149![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
150
Array.Clear(sortColumns, i, 1);
151
}
152
}
153![](/Images/OutliningIndicators/InBlock.gif)
154
return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
155![](/Images/OutliningIndicators/InBlock.gif)
156
}
157![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
162
sortOrder = "";
163
sortOrderNo = -1;
164
for (int i = 0; i < sortColumns.Length; i++)
165![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
166
if (sortColumns[i].StartsWith(sortColumn))
167![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
181
string[] sortColumns = sortExpression.Split(",".ToCharArray());
182![](/Images/OutliningIndicators/InBlock.gif)
183
for (int i = 0; i < dgItem.Cells.Count; i++)
184![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
185
if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
186![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
193
string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
194![](/Images/OutliningIndicators/InBlock.gif)
195
if (sortImgLoc != String.Empty)
196![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](/Images/OutliningIndicators/InBlock.gif)
205
}
206
else
207![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
208![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
216
if (AllowMultiColumnSorting)
217![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
218
Literal litSortSeq = new Literal();
219
litSortSeq.Text = sortOrderNo.ToString();
220
dgItem.Cells[i].Controls.Add(litSortSeq);
221
222
}
223![](/Images/OutliningIndicators/InBlock.gif)
224![](/Images/OutliningIndicators/InBlock.gif)
225
}
226![](/Images/OutliningIndicators/InBlock.gif)
227![](/Images/OutliningIndicators/InBlock.gif)
228
229![](/Images/OutliningIndicators/InBlock.gif)
230
}
231![](/Images/OutliningIndicators/InBlock.gif)
232
}
233
}
234![](/Images/OutliningIndicators/InBlock.gif)
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
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
17
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
81
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
105
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
106
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
131
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
152
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
157
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
168
![](/Images/OutliningIndicators/InBlock.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/InBlock.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/InBlock.gif)
173
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
174
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
175
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
176
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
185
![](/Images/OutliningIndicators/InBlock.gif)
186
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/InBlock.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/InBlock.gif)
192
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/InBlock.gif)
195
![](/Images/OutliningIndicators/InBlock.gif)
196
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
197
![](/Images/OutliningIndicators/InBlock.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/InBlock.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/InBlock.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/InBlock.gif)
205
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
206
![](/Images/OutliningIndicators/InBlock.gif)
207
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/InBlock.gif)
210
![](/Images/OutliningIndicators/InBlock.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/InBlock.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/InBlock.gif)
215
![](/Images/OutliningIndicators/InBlock.gif)
216
![](/Images/OutliningIndicators/InBlock.gif)
217
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
218
![](/Images/OutliningIndicators/InBlock.gif)
219
![](/Images/OutliningIndicators/InBlock.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/InBlock.gif)
222
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
223
![](/Images/OutliningIndicators/InBlock.gif)
224
![](/Images/OutliningIndicators/InBlock.gif)
225
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
226
![](/Images/OutliningIndicators/InBlock.gif)
227
![](/Images/OutliningIndicators/InBlock.gif)
228
![](/Images/OutliningIndicators/InBlock.gif)
229
![](/Images/OutliningIndicators/InBlock.gif)
230
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
231
![](/Images/OutliningIndicators/InBlock.gif)
232
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
233
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
234
![](/Images/OutliningIndicators/InBlock.gif)
235
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
236
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
237
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
238
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
但是感覺很不爽
以下是一些相关的資料
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