我需要对组摘要字段进行排序。
实施例。我在网格中有3列。
步骤1:我通过按区域拖动Id列来按ID分组。
第2步:在列上添加总和,计数,平均值。
现在我想通过点击它来对总和或计数或平均值进行排序,以便整个分组按照100,200,300之和进行排序。
请帮助
答案 0 :(得分:0)
排序顺序由FieldSettings类的GroupByComparer控制,这可以通过为分组的字段创建自定义IComparer来完成。请注意,分组实际上也是一种排序,因此我假设您仍希望在首次对该列进行分组时进行默认排序。
在以下示例中,按单击时,可以按单个摘要结果对记录组进行排序。这是通过使用自定义IComparer来实现的,这些组按照标记的值进行排序(如果已设置),如果未设置,则按记录回退到组的值:
public class SummarySortComparer : IComparer
{
public int Compare(object x, object y)
{
GroupByRecord xRecord = x as GroupByRecord;
GroupByRecord yRecord = y as GroupByRecord;
IComparable xValue = xRecord.Value as IComparable;
object yValue = yRecord.Value;
if (xRecord.Tag != null)
{
xValue = xRecord.Tag as IComparable;
yValue = yRecord.Tag;
}
return xValue.CompareTo(yValue);
}
}
使用以下内容在网格上设置:
this.XamDataGrid1.FieldSettings.GroupByComparer = new SummarySortComparer();
使用网格的PreviewMouseLeftButtonDown获取已点击的摘要(如果有)并将记录组的标记设置为该摘要的值并刷新网格的类型:
void XamDataGrid1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
SummaryResultPresenter summaryResultPresenter =
Utilities.GetAncestorFromType(e.OriginalSource as DependencyObject, typeof (SummaryResultPresenter), false) as
SummaryResultPresenter;
if (summaryResultPresenter != null)
{
GroupBySummariesPresenter groupBySummariesPresenter =
Utilities.GetAncestorFromType(summaryResultPresenter,
typeof(GroupBySummariesPresenter), false) as GroupBySummariesPresenter;
if (groupBySummariesPresenter != null)
{
SummaryResult summaryResult = summaryResultPresenter.SummaryResult;
int summaryResultIndex = summaryResult.ParentCollection.IndexOf(summaryResult);
foreach (GroupByRecord groupRecord in groupBySummariesPresenter.GroupByRecord.ParentCollection)
{
groupRecord.Tag = groupRecord.ChildRecords.SummaryResults[summaryResultIndex].Value;
}
this.XamDataGrid1.Records.RefreshSort();
}
}
}
请注意,此示例中存在一些限制,因为我没有实现任何方法来清除哪些摘要已排序,因此如果需要,仍需要由您实现。我也没有包含更改排序方向的逻辑,并使用了字段当前排序的方向,所以如果你还想更新方向,那么也需要添加。