在Xaml Infragistics网格中对组摘要进行排序

时间:2013-12-19 13:15:53

标签: wpf infragistics

我需要对组摘要字段进行排序。

实施例。我在网格中有3列。

步骤1:我通过按区域拖动Id列来按ID分组。

第2步:在列上添加总和,计数,平均值。

现在我想通过点击它来对总和或计数或平均值进行排序,以便整个分组按照100,200,300之和进行排序。

请帮助

enter image description here

1 个答案:

答案 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();
        }
    }
}

请注意,此示例中存在一些限制,因为我没有实现任何方法来清除哪些摘要已排序,因此如果需要,仍需要由您实现。我也没有包含更改排序方向的逻辑,并使用了字段当前排序的方向,所以如果你还想更新方向,那么也需要添加。