在同一网格上创建多个自定义摘要(并计算仅对特定数字求和的摘要)

本文关键字:计算 数字 和的 求和 创建 网格 自定义 | 更新日期: 2023-09-27 18:23:47

我正在尝试创建另一个在同一网格上工作的自定义摘要。我已经有了以下内容,它从另外两列中计算百分比。

我现在正试图添加另一个自定义摘要,它对名为TestErrors的列的值进行求和。该coulm中的单元格只有3个不同的值:0、1和128。我想对所有非128的值求和(如果4个单元格包含0、1、1和128,则总和为2)。

如何在同一网格上创建两个不同的自定义摘要,以及如何计算折扣为128的摘要?

编辑:使用下面nempo的答案,我得到了以下内容,但它不能正常工作。没有显示任何值。

XAML:

<dxg:GridControl.GroupSummary>
                                                <dxg:GridSummaryItem FieldName="TestAmount" SummaryType="Sum" DisplayFormat="Number of tests: {0}"/>
                                                <dxg:GridSummaryItem FieldName="TestErrors" SummaryType="Custom" DisplayFormat="Number of errors: {0}" Tag="custsumError"/>
                                                <dxg:GridSummaryItem FieldName="TestErrorRate" SummaryType="Custom" DisplayFormat="Error rate: {0:P4}" Tag="custsumRate"/>
                                            </dxg:GridControl.GroupSummary>

C#:

private void dxgErrorGrid_CustomSummary(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            if (!e.IsTotalSummary)
                return;
            switch (e.SummaryProcess)
            {
                case CustomSummaryProcess.Start:
                    sumErrors = 0;
                    sumTests = 0;
                    sumTestErrors = 0;
                    break;
                case CustomSummaryProcess.Calculate:
                    var testError = Convert.ToInt32(((clsErrorData)e.Row).TestErrors);
                    sumTests += ((clsErrorData)e.Row).TestAmount;
                    sumErrors += testError;
                    sumTestErrors += testError != 128 ? testError : 0;
                    break;
                case CustomSummaryProcess.Finalize:
                    var summary = e.Item as GridSummaryItem;
                    if (summary == null || summary.Tag == null)
                        return;
                    switch (summary.Tag.ToString())
                    {
                        case "custsumError":
                            e.TotalValue = sumTestErrors;
                            break;
                        case "custsumRate":
                            e.TotalValue = (decimal)sumErrors / sumTests;
                            break;
                    }
                    break;
            }
        }

在同一网格上创建多个自定义摘要(并计算仅对特定数字求和的摘要)

若要创建两个不同的自定义摘要,可以使用XAML或GridControl.GroupSummary.Add方法
XAML示例:

<dxg:GridControl.GroupSummary>
    <dxg:GridSummaryItem FieldName="YourFieldName" SummaryType="Custom" Tag="Custom0"/>
    <dxg:GridSummaryItem FieldName="YourFieldName" SummaryType="Custom" Tag="Custom1"/>
</dxg:GridControl.GroupSummary>

c#示例:

dxgErrorGrid.GroupSummary.Add(SummaryItemType.Custom, "YourFieldName").Tag = "Custom0";
dxgErrorGrid.GroupSummary.Add(SummaryItemType.Custom, "YourFieldName").Tag = "Custom1";

GridControl.CustomSummary事件中,您可以使用SummaryItemBase.Tag属性轻松识别当前正在处理的摘要项
以下是示例:

private int sumErrors;
private int sumTests;
private int sumTestErrors;
private void dxgErrorGrid_CustomSummary(object sender, CustomSummaryEventArgs e)
{
    if (!e.IsGroupSummary)
        return;
    switch (e.SummaryProcess)
    {
        case CustomSummaryProcess.Start:
            sumErrors = 0;
            sumTests = 0;
            sumTestErrors = 0;
            break;
        case CustomSummaryProcess.Calculate:
            var testError = Convert.ToInt32(((clsErrorData)e.Row).TestErrors);
            sumTests += ((clsErrorData)e.Row).TestAmount;
            sumErrors += testError;
            sumTestErrors += testError != 128 ? testError : 0;
            break;
        case CustomSummaryProcess.Finalize:
            var summary = e.Item as GridSummaryItem;
            if (summary == null || summary.Tag == null)
                return;
            switch (summary.Tag.ToString())
            {
                case "Custom0":
                    e.TotalValue = (decimal)sumErrors / sumTests;
                    break;
                case "Custom1":
                    e.TotalValue = sumTestErrors;
                    break;
            }
            break;
    }
}