概要

XamDataGrid の SummaryDefinition で使用できる組み込みの Count 集計は、null、空文字、空白文字のセルもカウントします。本記事では、実質の値が存在するセルのみをカウントするカスタム SummaryCalculator の実装方法を説明します。

問題

XamDataGrid の SummaryDefinition の Calculator プロパティにデフォルトの Count を使用すると、データが null や空文字列 (“”) などであってもカウント対象に含まれてしまいます。実際に値があるセルだけを集計したい場合は、カスタム集計計算クラスを作成する必要があります。

解決策

SummaryCalculator を継承したカスタムクラスを作成し、Aggregate メソッド内で値の有無を確認することで、空でないセルのみをカウントできます。

実装手順

1. カスタム SummaryCalculator クラスの作成

以下のように SummaryCalculator を継承したクラスを実装します。

public class NonEmptyCountCalculator : SummaryCalculator
{
    private static NonEmptyCountCalculator? _instance;
    public static NonEmptyCountCalculator Instance => _instance ??= new NonEmptyCountCalculator();

    // カウンター(集計中に値があった行の数を保持します)
    private int _count;

    // SummaryDefinition の Calculator プロパティに表示される識別名
    public override string Name => "Non Empty Count";

    public override string Description => "値があるデータのみをカウント";

    // 処理可能なデータ型を指定(すべての型を対象にする)
    public override bool CanProcessDataType(Type dataType)
    {
        return true;
    }

    // 集計開始時にカウンターをリセット
    public override void BeginCalculation(SummaryResult summaryResult)
    {
        _count = 0;
    }

    // 各レコードで呼ばれ、値があるデータのみカウント
    public override void Aggregate(object dataValue, SummaryResult summaryResult, Record record)
    {
        if (dataValue != null &&                                    // null でないことを確認
            dataValue != DBNull.Value &&                            // データベースの null でないことを確認
            !string.IsNullOrWhiteSpace(dataValue.ToString()))       // 空文字や空白でないことを確認
        {
            _count++;
        }
    }

    // 集計終了時に結果を返します
    public override object EndCalculation(SummaryResult summaryResult)
    {
        return _count;
    }
}

ポイント

Aggregate メソッド内で空でないセルのみをカウントしています。

チェック用件目的
dataValue != nullCLR の null を除外
dataValue != DBNull.Valueデータベース由来の null を除外
!string.IsNullOrWhiteSpace( … )空文字列 (“”) や空白のみの文字列を除外

2. XAML での SummaryDefinition への適用

作成したカスタム計算クラス オブジェクトを SummaryDefinition の Calculator プロパティに指定します。

<igDP:XamDataGrid ...>

    <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout IsDefault="true">
            <igDP:FieldLayout.Fields>
                <igDP:Field Name="ID" Width="200"/>
                <igDP:Field Name="Test1" Width="200"/>
                <igDP:Field Name="Test2" Width="200"/>
            </igDP:FieldLayout.Fields>

            <igDP:FieldLayout.SummaryDefinitions>
                <igDP:SummaryDefinition SourceFieldName="Test1">
                    <igDP:SummaryDefinition.Calculator>
                        <local:NonEmptyCountCalculator />
                    </igDP:SummaryDefinition.Calculator>
                </igDP:SummaryDefinition>
            </igDP:FieldLayout.SummaryDefinitions>
        </igDP:FieldLayout>
    </igDP:XamDataGrid.FieldLayouts>

</igDP:XamDataGrid>

結果

 

 

関連ドキュメント

ガイド

 

Tagged:

製品について

Ultimate UI for WPF