概要
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 != null | CLR の 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>
結果

関連ドキュメント
ガイド