有时候客户想要在一个域内对ASPxGridView的栏进行分组,而在另一个域内对其排序。本文中,我想描述一下如何通过不同的方法实现这个特点。因为,这并不像它可能看起来的那样简单。
在设计时,我们创建了一个简单的网格,它的数据从数据源控件处获得。我们想按城市来对ASPxGridView进行分组,而按国家对它进行排序。
这个任务可以通过以下几种方法来解决:
1.通过自定义栏位排序:按城市将网格分组,但是通过自定义栏位排序事件按国家对其排序。
2.在另一个域内对网格排序:按城市将网格分组,但是通过分组汇总排序信息类按国家对其排序。
3.通过自定义汇总类型对网格排序:按城市将网格分组,但是通过分组汇总排序信息类和自定义汇总计算事件按国家对其排序。
4.通过它们的名字对值进行排序:使用GridViewDataComboBoxColumn文本完成分组。
下面,你可以找到一些关于这些任务的更详细的描述:
1.自定义栏位排序:按城市将ASPxGridView分组,但是通过自定义栏位排序事件按国家对其排序。
要使用这种方法,你应该运用ASPxGridView.CustomColumnSort 事件。一个栏的Settings.SortMode 属性指定了当对这个栏进行排序时,网格的数据是如何被排序的。在我们这个例子中,属性值被设为‘自定义’。因此,一个针对‘城市’栏的自定义排序算法将会 通过处理自定义栏位排序事件被执行。
[ASPx]
<dx:GridViewDataTextColumn FieldName="City" VisibleIndex="2" GroupIndex="0">
<Settings SortMode="Custom"/>
</dx:GridViewDataTextColumn>
在自定义栏位排序事件句柄中,我们对两行进行了比较。通过CustomColumnSortEventArgs.Column 参数来指定被处理的栏位。CustomColumnSortEventArgs.Value1 和CustomColumnSortEventArgs.Value2 两个参数区分出在这个栏中的行值。
自定义比较的结果用来设定CustomColumnSortEventArgs.Result 的参数,如下所示:
- 结果设为-1的情况,当数据以升序排列时,第一行应该放置在第二行的上面或者当数据位降序排列时,第一行放置在第二行的下面。
- 结果设为1的情况,当数据以升序排列时,第一行应该放置在第二行的下面或者当数据位降序排列时,第一行放置在第二行的上面。
- 结果设为0时表示这两行相等。这种情况下,这些行在网格里的位置将会根据它们在数据源里的索引来确定。
我们把e.handled参数的值设为真,从而忽略掉默认的比较机制。
[C#]
protected void gridCustomers_CustomColumnSort(object sender, CustomColumnSortEventArgs e) {
if (e.Column != null & e.Column.FieldName == "City") {
object country1 = e.GetRow1Value("Country");
object country2 = e.GetRow2Value("Country");
int res = Comparer.Default.Compare(country1, country2);
if (res == 0) {
object city1 = e.Value1;
object city2 = e.Value2;
res = Comparer.Default.Compare(city1, city2);
}
e.Result = res;
e.Handled = true;
}
}
2.在另一个域内对ASPxGridView排序:按城市将ASPxGridView分组,但是通过分组汇总排序信息类按国家对其排序。
根据ASPxGroupSummarySortInfo对象提供的信息,基于此信息得到的汇总值来将组中的行排序。这些对象引入的属性代表了排序次序,用来计算汇总值的汇总项,等等。这些属性是只读的,并且由构造函数来初始化。
通过汇总值来排序组中的行,创建一个ASPxGroupSummarySortInfo对象,使用 GroupSummarySortInfoCollection.Add 方法把它添加到ASPxGridView的分组汇总排序信息集合里。把ASPxGroupSummarySortInfo对象添加到这个集合以后,组中的 行就会根据它们的汇总值自动的排序。
[C#]
gridCustomers.GroupSummarySortInfo.Clear();
ASPxGroupSummarySortInfo sortInfo = new ASPxGroupSummarySortInfo();
sortInfo.SortOrder = ColumnSortOrder.Ascending;
sortInfo.SummaryItem = gridCustomers.GroupSummary["Country", SummaryItemType.Min];
sortInfo.GroupColumn = "City";
3.通过自定义汇总类型对ASPxGridView排序:按城市将ASPxGridView分组,但是通过分组汇总排序信息类和自定义汇总计算事件按国家对其排序。
这种方法与前一种方法的不同点仅仅在于排序机制使用了一个自定义的汇总值。汇总自定义计算法则应用到自定义汇总计算事件句柄中。自定义汇总计算事件会触发 汇总计算中涉及到的每一行。当计算总的汇总值的时候,该事件将会被每一个数据行触发。在当前这个例子里,为了简单起见,自定义的总的汇总值等于子汇总值。
请参考ASPxGridView.CustomSummaryCalculate 事件和自定义汇总函数,这有助于学习更多关于自定义汇总计算过程的知识。
[C#]
gridCustomers.GroupSummarySortInfo.Clear();
ASPxGroupSummarySortInfo sortInfo = new ASPxGroupSummarySortInfo();
sortInfo.SortOrder = ColumnSortOrder.Ascending;
sortInfo.SummaryItem = gridCustomers.GroupSummary["Country", SummaryItemType.Custom];
sortInfo.GroupColumn = "City";
gridCustomers.GroupSummarySortInfo.AddRange(sortInfo);
[C#]
protected void gridCustomers_CustomSummaryCalculate(object sender, CustomSummaryEventArgs e) {
ASPxSummaryItem item = e.Item as ASPxSummaryItem;
if (item.FieldName == "Country") {
if (e.SummaryProcess == CustomSummaryProcess.Finalize)
e.TotalValue = e.FieldValue.ToString();
}
}
4.通过它们的名字对值进行排序:使用GridViewDataComboBoxColumn文本完成分组。
想通过文本而不是值来对GridViewDataComboBoxColumn进行排序的话,你应该将ASPxGridViewBehaviorSettings.SortMode 属性值设为‘显示文本’。
[ASPx]
<SettingsBehavior SortMode="DisplayText" />
同样,这种方法演示了如何为已分组的栏显示一个自定义文本。你应该使用GroupRowContent模板来完成这个任务。
[ASPx]
<Templates>
<GroupRowContent>
<%# "Category: " + Container.GroupText%>
</GroupRowContent>
</Templates>