はじめに
以前公開した記事『SQL Serverのデータをグリッドで表示するWPFアプリケーションの作成』 では、SQL Serverのデータベースファイルを連結し、複数テーブルから抽出したデータを表示して、カテゴリ名でグループ化する機能を持ったアプリケーションを作成しました。
今回は第2弾として、ComponentOne Studio Enterprise 2011JのFlexGrid for WPFコンポーネントを使い、さらに機能を強化したWPFアプリケーションの作成を行います。今回アプリケーションに追加するのは、グループ化したカテゴリ名のセルを結合して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 | 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」です。
GUIの作成
これまで作成したウィンドウに、2つのCheckBoxコントロールを追加し、Checked/Uncheckedイベントハンドラを追加します。
なお、C1FlexGridコンポーネントの概要については、『独自の入力グリッドを持ったWPFアプリケーションの作成』を参照ください。
セルのマージ
C1FlexGridコントロールの優れている点は、多くの優秀な機能があらかじめコントロールに組み込まれており、メンバメソッドとプロパティを使ってこれらの機能を簡単に使うことができる点です。
自分でコードを書くとなると、とても大変で膨大な作業量になってしまいますが、C1FlexGridコントロールではメンバメソッドやプロパティを呼び出す式を書くだけで済みます。グリッドのセルの結合(マージ)もあらかじめC1FlexGridコントロールに組み込まれており、この機能を使うかどうかと、どこのセルを結合するのかを指定するだけで、グリッド内のセルを自由に結合させることができます。
使い方は簡単で、まずC1FlexGridコントロールの「AllowMerging」プロパティをTrueに設定し、グリッドレベルのセル結合機能を有効にします。設定値は「AllowMerging列挙体」のメンバで、以下の設定値を使用します。ここでは、セルを結合するので「Cells」を選びます。
メンバ名 | 説明 |
None | 結合しない |
Cells | スクロール可能なセルを結合 |
ColumnHeaders | 列ヘッダーを結合 |
RowHeaders | 行ヘッダーを結合 |
AllHeaders | 列ヘッダーと行ヘッダーを結合 |
All | すべての領域を結合 |
Rows/Columnsプロパティで結合したいセルの方向を行列単位で指定します。そして、それらのセルの「AllowMerging」プロパティをTrueに設定すると、指定した行および列のセルを結合します。
ここでは、同じカテゴリ名のセルを列単位で結合するため、Columnsプロパティに「CategoryName」を指定し、「AllowMerging」プロパティをTrueにします。カテゴリ名でグループ化していなければ、隣接する同じカテゴリ名のセルが結合されます。グループ化が実行されれば、そのまま同じカテゴリ名のセルが1つのセルに結合されます。セルの結合を解除する場合は、AllowMergingプロパティの値に「AllowMerging.None」を設定します。
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
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列挙体のメンバで、以下の集計を行うことができます。
メンバ名 | 説明 |
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」に設定しておきます。
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
private void checkBox3_Checked(object sender, RoutedEventArgs e) { ..... ..... //カテゴリ毎に価格の合計を集計 C1FlexGrid1.AreRowGroupHeadersFrozen = false; C1FlexGrid1.Columns["ListPrice"].GroupAggregate = Aggregate.Sum;
グループ集計を解除するには、GroupAggregateプロパティに「Aggregate.None」を指定します。
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
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コントロールの導入は大きな力になるのではないでしょうか。