はじめに
データベースのデータを表示するアプリケーションを作成する際は、どのようにデータを表示するかがポイントになります。この表示形式は、多くの場合はデータの種類によって決めることができますが、単純な行列ではデータを表現しづらいこともあります。
レイアウトを定義するテンプレートを採用し、グリッドのセルを自由自在にレイアウトできるため、複雑な表画面や明細画面を持つアプリケーションの開発にとても適したコントロールとなっています。
今回は、このGcMultiRowコントロールを使用してデータベースデータを水平方向に展開するアプリケーションを作成しました。
対象読者
Visual Studio 2010/2012/2013/2015を使ってプログラムを作ったことがある人。
必要な環境
Visual Studio 2010/2012/2013/2015でプログラムが作れる環境。
なお、本プログラムは次の環境で開発・動作確認を行っています。
- OS:Windows 7
- 開発Tool: Visual Studio 2010、.NET Framework 4
プログラム実行時の注意事項
本稿のプロジェクトファイルを動かすには、記事に添付されているサンプルファイルのフォルダ構成を変えずに実行してください。
コンポーネントのインストール
本サンプルアプリケーションでは、PowerTools MultiRow for Windows Forms 8.0JのGcMultiRowコントロールを使用します。このコントロールを使用するには、Visual StudioにPowerTools MultiRow for Windows Forms 8.0Jをインストールする必要があります。
トライアル版は、グレープシティのWebページから申し込みできます。トライアル申込フォームが表示されますので、必要情報を入力して申し込むとトライアル版のダウンロード手順を記載したE-Mailが送られてきます。その手順にそってダウンロードを行ってください。
また、ダウンロードファイルは圧縮ファイルになっていますので、解凍してインストーラを起動します。
制限事項やサポートする必要システム環境などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールと参照の追加
PowerTools MultiRow for Windows Forms 8.0Jをインストールしたら、プロジェクトにコントロールを追加します。
ツールボックスに専用のタブを作成し、GcMultiRowコンポーネントを追加します。
これらのコントロールを追加すると、プロジェクトに画面のようなランタイムライブラリへの参照が追加されます。
GcMultiRowコントロールの概要と機能
GcMultiRowコントロールは表形式でデータを表示、入力するグリッドコントロールを提供します。このコントロールは、1レコードを複数行で表示する複雑な表画面や明細画面を持つアプリケーションの作成に適した機能を提供しています。
データ連結
GcMultiRowコントロールは、3つのデータ連結モードをサポートしており、用途に合わせて最適なモードを選択できます。
アンバウンド(非連結)モード
アンバウンドモードは、比較的少量のデータを表示するのに適しています。
このモードでは、データソースに直接接続せず、すべてのデータをGcMultiRowコントロール内に保持します。このモードは、表形式のデータを表示専用で提供する場合や、データソースとの接続を独自にコーディングする場合に使用できます。
バウンドモード
バウンドモードはデータソースに接続し、データの同期と読み書きを行う場合に適しています。.NET Frameworkの標準コントロールと同じようにADO.NETを使用してデータベースに接続できます。
このモードでは、すべてのデータはデータソースに保持され、必要に応じてGcMultiRowコントロールの値が自動的に更新されます。GcMultiRowコントロールでデータを変更した場合も、自動的に反映されます。このモードは、一般的なデータベース アプリケーションの構築に使用できます。
仮想モード
仮想モードは大量のデータを高速に扱う場合に適しています。
このモードでは、GcMultiRowコントロールはデータを自動的にグリッドに読み込みません。開発者は、すべてのデータの更新や反映のタイミングをコーディングしてデータの表示や転送を指示します。このモードは、必要最小限のデータのみを保持してパフォーマンスを改善する用途に適しています。
ファイル入出力
GcMultiRowコントロールは、テンプレートのレイアウトおよび名前付きセルスタイルをXMLファイルとして保存し、読み込むことができます。XMLファイルはテキストであるため、テキストエディタやXMLエディタで表示し、変更点や差分を直接確認することもできます。
また、行セクションに配置されたセルのデータをCSV形式(カンマで区切られたデータ)で出力できます。
行セクションに配置されたすべてのデータを出力するには、SaveTextFileメソッドを使用します。
SaveTextFileRangeメソッドを使用すると、出力対象データを行単位で指定できます。SaveTextFileRangeメソッドではデータを出力する開始行と終了行を指定します。
CSV形式で出力するデータに対して、行や列の区切り文字、CSVファイルのエンコード形式などを設定できます。
出力オプションは、行セクションの全データの出力(SaveTextFileメソッド)と指定した行範囲のデータ出力(SaveTextFileRangeメソッド)でそれぞれに設定できる項目が異なります。
SaveTextFileRangeメソッドでは、次の項目を出力ファイルに指定できます。
- 出力ファイルのパスとファイル名
- 出力ファイルのエンコード
- 行の区切り文字
- 列の区切り文字
- セルの区切り文字
- セルの区切り文字の出力有無
- 行ヘッダセルの出力有無
水平方向へのデータの展開
GcMultiRowコントロールは、設計時にデータの展開方向を垂直または水平方向のどちらかに指定できます。実行時には指定したデータの展開方向に対して行を繰り返し表示します。
特に 水平方向に行を繰り返し表示する機能は、このGcMultiRowコントロールの大きな特徴で、たとえばMicrosoft Accessなどでは行方向に自動的に入力レコードが追加されていきますが、GcMultiRowコントロールでは「列モード テンプレート」を使用することで、行を列のように表現することが可能になり、列方向に入力レコードを自動的に拡張してくれます。
この機能を使うことで、時系列でデータを展開するようなアプリケーションの開発に最も適しています。
列モード テンプレート
列モードを使用すると、行を左から右に繰り返し表示して使用することができます。ここでは、列モード テンプレートの特徴について説明します。
列モードの設定
列モードを使用するには、Template.LayoutModeプロパティをLeftToRightに設定します。
レイアウト
テンプレートが行モードと列モードの場合では、以下のプロパティとメソッドにて取得または設定する対象が異なります。
プロパティ/メソッド | TopToBottom | LeftToRight |
---|---|---|
Template.Width | 取得時:テンプレートの幅 | 取得時:すべてのセクションの全体の幅 |
設定時:テンプレートの幅 | 設定時:テンプレートの幅 | |
Template.Height | 取得時:すべてのセクションの全体の高さ | 取得時:テンプレートの高さ |
設定時:設定不可 | 設定時:テンプレートの高さ | |
Section.Width | 取得時:テンプレートの幅 | 取得時:セクションの幅 |
設定時:セクションの幅 | 設定時:セクションの幅 | |
Section.Height | 取得時:セクションの高さ | 取得時:テンプレートの高さ |
設定時:セクションの高さ | 設定時:テンプレートの高さ | |
GcMultiRow.SectionWidth | 取得時:テンプレートの幅 | 取得時:すべてのセクションの全体の幅 |
GcMultiRow.SectionHeight | 取得時:すべてのセクションの全体の高さ | 取得時:テンプレートの高さ |
RowCollection.GetRowsHeight | 戻り値:指定した行全体の高さ | 戻り値:テンプレートの高さ |
RowCollection.GetRowsWidth | 戻り値:テンプレートの幅 | 戻り値:指定した行の全体の幅 |
SelectionActionsの動作
列モードにおける、主なSelectionActionsの動作は次のようになります。
ソート
列モードでは、グリッドの水平方向のセルに対してソートが行われます。
マージ
列モードでは、グリッドの水平方向のセルに対して自動マージ機能が有効になります。
フィルタ
列モードでは、グリッドの水平方向のセルに対してフィルタが行われます。
現在の行のスタイル
現在の行のスタイルを設定した場合、次のように列に対してスタイルが適用されます。
セルの値をクリップボードにコピー
列モードでは、GcMultiRowコントロールのセルの値をクリップボードにコピーした場合、行と列が表示されている内容とは反転してコピーされます。
テンプレートウィザード
テンプレートウィザードを使うことで、簡単に列モードのテンプレートを作成することができます。
先に説明したデータ連結をプロジェクトに対して行っていれば、データソースのフィールドをセルに設定し自動的に列モードのテンプレートを作成してくれます(詳しくはアプリケーション作成の手順で説明します)。
また、一度作成したテンプレートを列モードに変換したい場合でも、テンプレートのデザイン画面でTemplate.LayoutModeプロパティを使用してデータの展開方向を列方向に変更することができます。
このように、GcMultiRowコントロールはデータの用途に合った形にテンプレートを自由に組み替えることができる特徴を持っています。
アプリケーションの作成
では、さっそくアプリケーションを作成していきましょう。
今回は、健康診断の血液検査結果を格納したSQL Serverのデータベースを読み込み、列モードで列方向に時系列的に検査結果を表示するアプリケーションを作ってみます。
データベースには、列方向に検査項目が並び、行方向にこれまでの検査結果が時系列的に格納されています。
アプリケーションではこの行列を逆にし、行方向に検査項目を並べ、列方向に過去の検査結果を並べることで、数値の時系列的変化を見ることができるようにしています。
なお、本来はSQL Server内のデータベースファイルに連結させたアプリケーションを作成しますが、本稿ではローカルに置かれたデータベースファイルに連結したアプリケーションを作成しています。
フォームのレイアウト
フォームには、WindowsフォームビューワのViewerコントロールを配置し、Dockプロパティを「Fill」に設定します。
フォームは、Loadイベントハンドラを作成します。
データ連結
アプリケーションにGcMultiRowコントロールを作成する前に、プロジェクトにデータベースファイルを連結させます。この操作はGcMultiRowコントロールに依存せず、通常のADOを使ったデータベース連結の操作になります。
なお、本稿でのVisual Studioの操作はVisual Studio 2010のものです。
(1)Visual Studioのメニューから「データ-新しいデータソースの追加」を選びます。
(2)データソース構成ウィザードに従って、データベースファイル「精密検査結果_Data.mdf」を連結します。
(3)データセットにテーブル「検査結果」を組み込みます。
テンプレートの作成
データ連結ができたら、このデータセットをもとにグリッドレイアウトのテンプレートを作成します。
(1)ツールボックスからフォームにGcMultiRowコントロールをドラッグアンドドロップします。
そしてスマートタグから「新しいテンプレートの作成」をクリックします。
(2)テンプレートウィザードが起動しますので、「データソースの定義からテンプレートを作成する」をクリックし「次へ」ボタンをクリックします。
(3)「水平方向へ展開」をクリックし「次へ」ボタンをクリックします。この設定で、レコードは水平方向(列方向)に展開されるようになります。
(4)データソースに「検査結果」を選び「次へ」ボタンをクリックします。
(5)「クエリーの設計」ではそのまま「次へ」ボタンをクリックします。
このページは表示するデータを選択する画面です。表示したいフィールドが一括で表示されるようになっていますので、個別に選択したい場合は「削除」ボタンで表示したくない項目を選びます。
(6)「テンプレートのレイアウトのデザイン」もそのままで「次へ」ボタンをクリックします。
(7)「スタイルを選択」画面では、あらかじめプリセットされているスタイルを使うことができます。このスタイルを使えば、グリッドの外観を細かく設定せずにカラフルなグリッドに仕上げることができます。ここでは、「Papyrus」をクリックし「次へ」ボタンをクリックします。
(8)「完了」ボタンをクリックすればテンプレートが出来上がります。
GcMultiRowコントロールとデータソースの連結
GcMultiRowコントロールとデータソースを連結させます。
プロジェクトにはすでにデータ連結が行われていますので、ウィザードにしたがってそれを連結していくだけです。
(1)もう一度スマートタグを開き、「データソースの選択-他のデータソース-プロジェクト データ ソース」をクリックします。
(2)そのままウィザードに従い「次へ」ボタンをクリックし、テーブル「検査結果」をクリックして完了ボタンをクリックします。
(3)以上でデータベースファイルがGcMultiRowコントロールで表示され、列方向にデータが表示されるアプリケーションが出来上がりました。
プロジェクトを実行して動作確認をします。データベースのデータが列方向に表示されます。
また、データ未入力の欄にデータを入力すると、列方向に新たに入力列が自動的に追加されます。
日付データがあればカレンダーが表示されますので、ここから入力することも可能です。
1レコード複数列表示のデザイン
GcMultiRowコントロールの特徴の一つに、1レコード複数列表示があります。
複雑なデータを整理して表示したい時、データを複数の列に分けたい時があります。特に日本の帳票ではこの複数列表示を使っている場合が多いですね。GcMultiRowコントロールの複数列表示は、そのような日本の事情に合わせて、とても簡単に1レコード複数列表示を設定することができます。
ここでは、テンプレートのレイアウトを変更し、白血球数の隣に赤血球数を表示します。テンプレートで複数列表示にするので、データはこのレイアウト通りにレコード数分繰り返して表示されます。
(1)ソリューションエクスプローラで「Template1.cs」をダブルクリックします。テンプレートデザイナが起動し、テンプレートが表示されます。
(2)ルーラーをドラッグし、「230」ピクセルまで広げます。
(3)上から2行のヘッダセルを幅一杯までドラッグします。
(4)ツールボックスからHeaderCellを白血球数の横にドラッグアンドドロップします。 そして、プロパティウィンドウでValueプロパティに「赤血球数」と入力します。
(5)もともとあったヘッダ「赤血球数」の横にある「NmericUpDownCell」を、今配置したヘッダセルの横にドラッグします。これで、レコードのフィールドデータは連結したまま、表示を2列に変更できました。
(6)オリジナルのヘッダ「赤血球数」を削除し、その下にある各項目のヘッダセルと数値入力セルを上にずらします。
(7)残りの項目の数値入力セルを幅いっぱいにドラッグしてサイズを合わせます。
(8)最後に、最下部の枠線をドラッグして最下行を消して出来上がりです。
(9)もう一度アプリケーションを実行すると、白血球と赤血球のレコードデータが2列で表示されます。
なお、赤血球数のヘッダセルのスタイルを他のヘッダセルに揃えたい場合は、次の手順でスタイルを変更することもできます。
(1)テンプレートのデザイン画面で赤血球数のHeaderCellをクリックし、選択状態にします。
(2)プロパティウィンドウでFlatStyleプロパティをFlatにします。
(3)HeaderCellのStyleプロパティをNamed Styleにします。
(4)Styleプロパティを展開し、CellStyleNameプロパティの値欄のリストから「HeaderCellStyle1」を選びます。このような操作で、ヘッダセルのスタイルを統一させることができます。
CSV形式のファイルにエクスポートする処理
最後に、フォームのデザインを整え、グリッドデータをCSV形式のファイルにエクスポートする処理を作成します。
今回は、データ全てをCSVファイルに保存します。
この処理はとても簡単で、まずフォームにSaveFileDialogコントロールとButtonコントロールを配置します。そして、ButtonコントロールのClickイベントハンドラで、GcMultiRowコントロールのSaveTextFileメソッドを実行するだけです。
CSV形式で保存できれば、たとえばMicrosoft Excelなどでデータを見ることができます。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim fname As String = "" SaveFileDialog1.Filter = "CSV File|*.csv" If (SaveFileDialog1.ShowDialog()) = Windows.Forms.DialogResult.OK Then fname = SaveFileDialog1.FileName GcMultiRow1.SaveTextFile(fname) End If End Sub
private void button1_Click(object sender, EventArgs e) { String fname = ""; saveFileDialog1.Filter = "CSV File|*.csv"; if(saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { fname = saveFileDialog1.FileName; gcMultiRow1.SaveTextFile(fname); } }
まとめ
GcMultiRowコントロールは、複雑な形式の日本の帳票を作成するアプリケーションにぴったりのコントロールです。今回は取り上げませんでしたが、セルの入力規則や装飾機能、スタイル設定にマージやセル幅の自動調節機能など、帳票をデザインするのに必要な、かつプログラマの労力を補助してくれる多くの優秀な機能を持っています。
そのような中、限られた誌面の中でデータ連結とレコードの水平展開機能、CSVファイルへのエクスポート機能を取り上げて紹介しました。特に時系列データの表示については水平方向にデータを並べたほうがよりわかりやすいデータ表現になりますから、GcMultiRowコントロールの列方向へのデータ展開機能はとても適した機能といえます。また、アプリケーションの作成でも紹介したように、水平方向へのデータ展開がウィザードなどを使って簡単に実装できる点も、開発サイドの負担軽減につながると言えるでしょう。
もし帳票作成アプリケーションの設計にお悩みでしたら、GcMultiRowコントロールをアプリケーションに加えてみてはいかがでしょうか。