インフラジスティックス・ジャパン株式会社Blog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

Excel ライクに「複数セルを範囲選択した際の集計値をリアルタイムに表示する」 (平均、合計、データの個数) - WPF & XamDataGrid

こんにちは!

テクニカルコンサルティングチームの古堅です。

本記事では、弊社 WPF 製品「Ultimate UI for WPF」を長年ご利用頂いているお客様からのご要望を元に、Excel ライクな機能の実現として、弊社 WPF 製品「Ultimate UI for WPF」を利用した「複数セルを範囲選択した際の集計値 (平均、合計、データの個数) をリアルタイムに表示する」実装方法を紹介します!

サンプルの動作

複数セルを範囲選択した際の集計値をリアルタイムで表示します。

本サンプルでは、平均、合計、選択されたセル数を表示しています。

f:id:furugen098:20201225152615g:plain

f:id:furugen098:20201225153007g:plain

サンプル

サンプルのダウンロード

サンプルコード一式はこちらからダウンロードできます。

サンプルコードの解説

MainWindow.xaml
<StackPanel>
    <igWPF:XamDataGrid x:Name="xamDataGrid"
                       SelectedItemsChanged="xamDataGrid_SelectedItemsChanged" >
        <igWPF:XamDataGrid.FieldSettings>
            <igWPF:FieldSettings CellClickAction="SelectCell"/>
        </igWPF:XamDataGrid.FieldSettings>
        
    </igWPF:XamDataGrid>

    <!-- リアルタイム集計値の表示エリア -->
    <Border Padding="5" Background="LightGray">
        <StackPanel Orientation="Horizontal">
            <TextBlock Width="120" x:Name="lblAverage" Text="平均" Margin="12,0,0,0"></TextBlock>
            <TextBlock Width="200" x:Name="lblCount" Text="選択セルの個数" Margin="12,0,0,0"></TextBlock>
            <TextBlock Width="200" x:Name="lblSum" Text="合計"  ></TextBlock>
        </StackPanel>
    </Border>
</StackPanel>
MainWindow.xaml.cs
private void xamDataGrid_SelectedItemsChanged(object sender, Infragistics.Windows.DataPresenter.Events.SelectedItemsChangedEventArgs e)
{
    int cellCount = 0;
    int cellCountOfTypeNumber = 0;
    decimal average = 0;
    decimal sum = 0;

    foreach (var cell in xamDataGrid.SelectedItems.Cells)
    {
        if (cell.Value != null)
        {
           // 値があるセルであれば、カウントを増やす
            cellCount += 1;
            decimal addSum = 0;
           // 数値項目か判定
            if (Decimal.TryParse(cell.Value.ToString(), out addSum))
            {
                // 平均値を算出するため、数値型のセルのカウントを行う
                cellCountOfTypeNumber += 1;
                // 合計値を加算
                sum += addSum;
            }
        }
    }
    //  選択されたセルの情報を、各項目に反映する
    if (cellCountOfTypeNumber >= 1)
    {
        average = sum / cellCountOfTypeNumber;
    }
    lblAverage.Text = string.Format("平均 : {0:#,0}", average);
    lblCount.Text = string.Format("データの個数 : {0}", cellCount);
    lblSum.Text = string.Format("合計 : {0:#,0}", sum);
}

SelectedItemsChanged イベント

選択中のセルが変更された場合に発生するイベントです。

本サンプルでは、セル選択範囲の変更感知に採用しています。

jp.infragistics.com

SelectedItems.Cells プロパティ

選択中のセルの情報を取得できるプロパティです。

本サンプルでは、選択されたデータの個数、平均および合計値の取得に利用しました。

jp.infragistics.com

開発全般に関するご相談はお任せください!

インフラジスティックス・ジャパンでは、各プラットフォームの特別技術トレーニングの提供や、開発全般のご支援を行っています。

「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」

といったご相談を承っています。

お問い合せはこちらからお気軽にご相談ください。