CodeZine(コードジン)

特集ページ一覧

SQL Serverのデータをグリッドで表示するWPFアプリケーションの作成 その2

ComponentOne Studio Enterprise 2011JのC1FlexGridコントロールを使ったWPFアプリケーションの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/01/30 14:00

 12月に公開した「SQL Serverのデータをグリッドで表示するWPFアプリケーションの作成」では、SQL Serverのデータベースファイルを連結し、複数テーブルから抽出したデータを表示して、カテゴリ名でグループ化する機能を持ったアプリケーションを作成しました。今回は、さらにこのアプリケーションを強化し、グループ化したカテゴリ名のセルを結合して1つにまとめ、価格の合計金額を算出するグループ集計機能を追加します。

はじめに

 以前公開した記事『SQL Serverのデータをグリッドで表示するWPFアプリケーションの作成』 では、SQL Serverのデータベースファイルを連結し、複数テーブルから抽出したデータを表示して、カテゴリ名でグループ化する機能を持ったアプリケーションを作成しました。

 今回は第2弾として、ComponentOne Studio Enterprise 2011JのFlexGrid for WPFコンポーネントを使い、さらに機能を強化したWPFアプリケーションの作成を行います。今回アプリケーションに追加するのは、グループ化したカテゴリ名のセルを結合して1つにまとめ、価格の合計金額を算出するグループ集計機能です。

前回はカテゴリ名でデータをグループ化
前回はカテゴリ名でデータをグループ化
今回はグループ化した後、同じカテゴリ名のセルを1つにまとめる
今回はグループ化した後、同じカテゴリ名のセルを1つにまとめる
さらにカテゴリごとに価格の合計金額を集計
さらにカテゴリごとに価格の合計金額を集計

対象読者

 Visual Basic、Visual C# 2010を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic 2010、Visual C# 2010、Visual Studio 2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。

※サンプルソース実行時の注意事項

 動作環境として、あらかじめ.NET Framework 4.0がインストールされている必要があります。動作するOSは、以下を参照ください。


動作するOS一覧
OS 32ビット(x86) 64ビット(x64)
Windows XP 日本語版
Windows Vista 日本語版
Windows 7 日本語版
Windows Server 2003 日本語版
Windows Server 2008 日本語版
Windows Server 2008 R2 日本語版 -

コンポーネントのインストール

 この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for WPF 2011J)をインストールする必要があります。 インストーラは、グレープシティのWebページからダウンロードできます。

 製品のトライアル版一覧ページにてダウンロードしたい製品にチェックを入れ、ページ右上部の[申込フォーム]をクリックしてグレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 ComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for WPF 2011J)をインストールしたら、ツールボックスに専用のタブを作成し、使用するコントロールを追加します。追加するコントロールは、[WPFコンポーネント]でアセンブリ名が「C1.WPF.FlexGrid」の「C1FlexGrid」です。

「WPFコンポーネント」でアセンブリ名が「C1.WPF.FlexGrid」の「C1FlexGrid」コントロールを選択
「WPFコンポーネント」でアセンブリ名が「C1.WPF.FlexGrid」の「C1FlexGrid」コントロールを選択

GUIの作成

 これまで作成したウィンドウに、2つのCheckBoxコントロールを追加し、Checked/Uncheckedイベントハンドラを追加します。

 なお、C1FlexGridコンポーネントの概要については、『独自の入力グリッドを持ったWPFアプリケーションの作成』を参照ください。

GUIのデザインの修正
GUIのデザインの修正

セルのマージ

 C1FlexGridコントロールの優れている点は、多くの優秀な機能があらかじめコントロールに組み込まれており、メンバメソッドとプロパティを使ってこれらの機能を簡単に使うことができる点です。

 自分でコードを書くとなると、とても大変で膨大な作業量になってしまいますが、C1FlexGridコントロールではメンバメソッドやプロパティを呼び出す式を書くだけで済みます。グリッドのセルの結合(マージ)もあらかじめC1FlexGridコントロールに組み込まれており、この機能を使うかどうかと、どこのセルを結合するのかを指定するだけで、グリッド内のセルを自由に結合させることができます。

 使い方は簡単で、まずC1FlexGridコントロールの「AllowMerging」プロパティをTrueに設定し、グリッドレベルのセル結合機能を有効にします。設定値は「AllowMerging列挙体」のメンバで、以下の設定値を使用します。ここでは、セルを結合するので「Cells」を選びます。

AllowMerging列挙体
メンバ名 説明
None 結合しない
Cells スクロール可能なセルを結合
ColumnHeaders 列ヘッダーを結合
RowHeaders 行ヘッダーを結合
AllHeaders 列ヘッダーと行ヘッダーを結合
All すべての領域を結合

 Rows/Columnsプロパティで結合したいセルの方向を行列単位で指定します。そして、それらのセルの「AllowMerging」プロパティをTrueに設定すると、指定した行および列のセルを結合します。

 ここでは、同じカテゴリ名のセルを列単位で結合するため、Columnsプロパティに「CategoryName」を指定し、「AllowMerging」プロパティをTrueにします。カテゴリ名でグループ化していなければ、隣接する同じカテゴリ名のセルが結合されます。グループ化が実行されれば、そのまま同じカテゴリ名のセルが1つのセルに結合されます。セルの結合を解除する場合は、AllowMergingプロパティの値に「AllowMerging.None」を設定します。

セル結合前
セル結合前
カテゴリ名でグループ化していなければ、隣接する同じカテゴリ名のセルが結合される
カテゴリ名でグループ化していなければ、隣接する同じカテゴリ名のセルが結合される
グループ化が実行されれば、そのまま同じカテゴリ名のセルが1つのセルに結合される
グループ化が実行されれば、そのまま同じカテゴリ名のセルが結合される
Visual Basic
Private Sub CheckBox2_Checked(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CheckBox2.Checked
    'セルのマージモードを設定
    C1FlexGrid1.AllowMerging = AllowMerging.Cells

    'カテゴリ名でセルを結合
    C1FlexGrid1.Columns("CategoryName").AllowMerging = True
    C1FlexGrid1.Columns("CategoryName").Foreground = New SolidColorBrush(Colors.MediumSeaGreen)
End Sub

Private Sub CheckBox2_Unchecked(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CheckBox2.Unchecked
    'セルの結合を解除
    C1FlexGrid1.AllowMerging = AllowMerging.None
    C1FlexGrid1.Columns("CategoryName").Foreground = New SolidColorBrush(Colors.Black)
End Sub
C#
private void checkBox2_Checked(object sender, RoutedEventArgs e)
{
    //セルのマージモードを設定
    C1FlexGrid1.AllowMerging = AllowMerging.Cells;

    //カテゴリ名でセルを結合
    C1FlexGrid1.Columns["CategoryName"].AllowMerging = true;
    C1FlexGrid1.Columns["CategoryName"].Foreground = new SolidColorBrush(Colors.MediumSeaGreen);
}

private void checkBox2_Unchecked(object sender, RoutedEventArgs e)
{
    //セルの結合を解除
    C1FlexGrid1.AllowMerging = AllowMerging.None;
    C1FlexGrid1.Columns["CategoryName"].Foreground = new SolidColorBrush(Colors.Black);
}

グループ集計

 C1FlexGridコントロールでは、データをグループ化すると、グループごとに列単位でデータの集計ができます。この機能もとても簡単で、集計する列の「GroupAggregate」プロパティを設定するだけでC1FlexGridコントロールが自動的に集計を計算して表示してくれます。データを変更すると、集計結果も自動的に再計算されます。

 GroupAggregateプロパティの設定値はAggregate列挙体のメンバで、以下の集計を行うことができます。

Aggregate列挙体
メンバ名 説明
None 集計なし
Sum グループ内のすべての値の合計を返す
Count グループ内のnull以外の数を返す
Average グループ内のnull以外のセルの平均値を返す
Maximum グループ内の最大値を返す
Minimum グループ内の最小値を返す
Range グループ内の最大値と最小値の差を返す
Std グループ内の値の標本標準偏差を返す(n-1に基づく式を使用)
Var グループ内の値の標本分散を返す(n-1に基づく式を使用)
StdPop グループ内の値の母標準偏差を返す(nに基づく式を使用)
VarPop グループ内の値の母分散を返す(nに基づく式を使用)

 今回は、グループ化したカテゴリ名ごとに価格の合計金額を算出するため、操作対象に「Columns("ListPrice")」を指定し、GroupAggregateプロパティに「Aggregate.Sum」を指定します。集計結果はグループヘッダ行に表示されるため、集計を表示するにはC1FlexGridコントロールの「AreGroupHeadersFrozen」プロパティを「false」に設定しておきます。

Visual Basic
Private Sub CheckBox3_Checked(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CheckBox3.Checked
    .....
    .....
    'カテゴリ毎に価格の合計を集計
    C1FlexGrid1.AreRowGroupHeadersFrozen = False
    C1FlexGrid1.Columns("ListPrice").GroupAggregate = Aggregate.Sum
C#
private void checkBox3_Checked(object sender, RoutedEventArgs e)
{
    .....
    .....
    //カテゴリ毎に価格の合計を集計
    C1FlexGrid1.AreRowGroupHeadersFrozen = false;
    C1FlexGrid1.Columns["ListPrice"].GroupAggregate = Aggregate.Sum;

 グループ集計を解除するには、GroupAggregateプロパティに「Aggregate.None」を指定します。

カテゴリ名ごとに価格の合計金額を集計し表示する
カテゴリ名ごとに価格の合計金額を集計し表示する
Visual Basic
Private Sub CheckBox3_Checked(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CheckBox3.Checked
    '現在のグループ化を一度解除
    view.GroupDescriptions.Clear()
    CheckBox1.IsChecked = False

    '改めて価格でグループ化
    view.GroupDescriptions.Add(New PropertyGroupDescription("CategoryName"))

    'カテゴリ毎に価格の合計を集計
    C1FlexGrid1.AreRowGroupHeadersFrozen = False
    C1FlexGrid1.Columns("ListPrice").GroupAggregate = Aggregate.Sum
End Sub

Private Sub CheckBox3_Unchecked(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CheckBox3.Unchecked
    'グループ集計を解除
    C1FlexGrid1.Columns("ListPrice").GroupAggregate = Aggregate.None

    'グループ化を解除
    view.GroupDescriptions.Clear()
    CheckBox1.IsChecked = False
End Sub
C#
private void checkBox3_Checked(object sender, RoutedEventArgs e)
{
    //現在のグループ化を一度解除
    view.GroupDescriptions.Clear();
    CheckBox1.IsChecked = false;

    //改めて価格でグループ化
    view.GroupDescriptions.Add(new PropertyGroupDescription("CategoryName"));

    //カテゴリ毎に価格の合計を集計
    C1FlexGrid1.AreRowGroupHeadersFrozen = false;
    C1FlexGrid1.Columns["ListPrice"].GroupAggregate = Aggregate.Sum;
}

private void checkBox3_Unchecked(object sender, RoutedEventArgs e)
{
    //グループ集計を解除
    C1FlexGrid1.Columns["ListPrice"].GroupAggregate = Aggregate.None;

    //グループ化を解除
    view.GroupDescriptions.Clear();
    CheckBox1.IsChecked = false;
}

まとめ

 データベースからデータを取り出して一覧表にする場合、多くはデータを何らかの形で集計して使用します。C1FlexGridコントロールは、そのような集計機能もあらかじめ組み込まれているため、面倒なコーディングの必要は無く、すぐにその機能を使うことができます。また、複数の同じデータがあるセルを1つのセルにまとめてしまえば、表の見やすさは格段に向上します。

 データベースのフロントエンドアプリケーション開発に苦労しているのであれば、C1FlexGridコントロールの導入は大きな力になるのではないでしょうか。

参考文献

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5