SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(MultiRow)(AD)

「MultiRow for Windows Forms」による、時系列データの表示に適した.NETアプリケーションの作成

PowerTools MultiRow for Windows Forms 8.0J のGcMultiRowコントロールを使ったWindowsフォームアプリケーションの作成

  • X ポスト
  • このエントリーをはてなブックマークに追加

 GcMultiRowコントロールは、1レコードのデータを表示するレイアウトを定義して、そのレイアウトに沿ってレコードの数だけ繰り返し表示することができます。また、レコードの展開方向は垂直方向/水平方向のどちらかを選択することができます。今回は、GcMultiRowコントロールのデータを水平方向に展開する機能を使用して、時系列データの表示に適したアプリケーションを作成します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 データベースのデータを表示するアプリケーションを作成する際は、どのようにデータを表示するかがポイントになります。この表示形式は、多くの場合はデータの種類によって決めることができますが、単純な行列ではデータを表現しづらいこともあります。

 レイアウトを定義するテンプレートを採用し、グリッドのセルを自由自在にレイアウトできるため、複雑な表画面や明細画面を持つアプリケーションの開発にとても適したコントロールとなっています。

 今回は、このGcMultiRowコントロールを使用してデータベースデータを水平方向に展開するアプリケーションを作成しました。

複数列を持ったままデータを水平方向に展開する
複数列を持ったままデータを水平方向に展開する
データはCSV形式にエクスポートできる
データはCSV形式にエクスポートできる

対象読者

 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コントロールを追加する

 これらのコントロールを追加すると、プロジェクトに画面のようなランタイムライブラリへの参照が追加されます。

追加された参照設定
追加された参照設定

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の動作は次のようになります。

列モードにおける主な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」を連結します。

データベースファイル「精密検査結果_Data.mdf」を連結する
データベースファイル「精密検査結果_Data.mdf」を連結する

 (3)データセットにテーブル「検査結果」を組み込みます。

データセットにテーブル「検査結果」を組み込む
データセットにテーブル「検査結果」を組み込む

テンプレートの作成

 データ連結ができたら、このデータセットをもとにグリッドレイアウトのテンプレートを作成します。

 (1)ツールボックスからフォームにGcMultiRowコントロールをドラッグアンドドロップします。

 そしてスマートタグから「新しいテンプレートの作成」をクリックします。

スマートタグから「新しいテンプレートの作成」をクリック
スマートタグから「新しいテンプレートの作成」をクリック

 (2)テンプレートウィザードが起動しますので、「データソースの定義からテンプレートを作成する」をクリックし「次へ」ボタンをクリックします。

「データソースの定義からテンプレートを作成する」をクリック
「データソースの定義からテンプレートを作成する」をクリック

 (3)「水平方向へ展開」をクリックし「次へ」ボタンをクリックします。この設定で、レコードは水平方向(列方向)に展開されるようになります。

「水平方向へ展開」をクリックし「次へ」ボタンをクリック
「水平方向へ展開」をクリックし「次へ」ボタンをクリック

 (4)データソースに「検査結果」を選び「次へ」ボタンをクリックします。

データソースに「検査結果」を選び「次へ」ボタンをクリック
データソースに「検査結果」を選び「次へ」ボタンをクリック

 (5)「クエリーの設計」ではそのまま「次へ」ボタンをクリックします。

 このページは表示するデータを選択する画面です。表示したいフィールドが一括で表示されるようになっていますので、個別に選択したい場合は「削除」ボタンで表示したくない項目を選びます。

「クエリーの設計」ではそのまま「次へ」ボタンをクリック
「クエリーの設計」ではそのまま「次へ」ボタンをクリック

 (6)「テンプレートのレイアウトのデザイン」もそのままで「次へ」ボタンをクリックします。

「テンプレートのレイアウトのデザイン」もそのままで「次へ」ボタンをクリック
「テンプレートのレイアウトのデザイン」もそのままで「次へ」ボタンをクリック

 (7)「スタイルを選択」画面では、あらかじめプリセットされているスタイルを使うことができます。このスタイルを使えば、グリッドの外観を細かく設定せずにカラフルなグリッドに仕上げることができます。ここでは、「Papyrus」をクリックし「次へ」ボタンをクリックします。

「Papyrus」をクリックし「次へ」ボタンをクリック
「Papyrus」をクリックし「次へ」ボタンをクリック

 (8)「完了」ボタンをクリックすればテンプレートが出来上がります。

「完了」ボタンをクリック
「完了」ボタンをクリック

GcMultiRowコントロールとデータソースの連結

 GcMultiRowコントロールとデータソースを連結させます。

 プロジェクトにはすでにデータ連結が行われていますので、ウィザードにしたがってそれを連結していくだけです。

 (1)もう一度スマートタグを開き、「データソースの選択-他のデータソース-プロジェクト データ ソース」をクリックします。

「データソースの選択-他のデータソース-プロジェクト データ ソース」をクリック
「データソースの選択-他のデータソース-プロジェクト データ ソース」をクリック

 (2)そのままウィザードに従い「次へ」ボタンをクリックし、テーブル「検査結果」をクリックして完了ボタンをクリックします。

テーブル「検査結果」をクリックして完了ボタンをクリック
テーブル「検査結果」をクリックして完了ボタンをクリック

 (3)以上でデータベースファイルがGcMultiRowコントロールで表示され、列方向にデータが表示されるアプリケーションが出来上がりました。

 プロジェクトを実行して動作確認をします。データベースのデータが列方向に表示されます。

アプリケーションの実行画面
アプリケーションの実行画面

 また、データ未入力の欄にデータを入力すると、列方向に新たに入力列が自動的に追加されます。

 日付データがあればカレンダーが表示されますので、ここから入力することも可能です。

列方向に新たに入力列が自動的に追加されていく
列方向に新たに入力列が自動的に追加されていく

1レコード複数列表示のデザイン

 GcMultiRowコントロールの特徴の一つに、1レコード複数列表示があります。

 複雑なデータを整理して表示したい時、データを複数の列に分けたい時があります。特に日本の帳票ではこの複数列表示を使っている場合が多いですね。GcMultiRowコントロールの複数列表示は、そのような日本の事情に合わせて、とても簡単に1レコード複数列表示を設定することができます。

 ここでは、テンプレートのレイアウトを変更し、白血球数の隣に赤血球数を表示します。テンプレートで複数列表示にするので、データはこのレイアウト通りにレコード数分繰り返して表示されます。

白血球数の隣に赤血球数を表示したレイアウト
白血球数の隣に赤血球数を表示したレイアウト

 (1)ソリューションエクスプローラで「Template1.cs」をダブルクリックします。テンプレートデザイナが起動し、テンプレートが表示されます。

ソリューションエクスプローラで「Template1.cs」をダブルクリック
ソリューションエクスプローラで「Template1.cs」をダブルクリック

 (2)ルーラーをドラッグし、「230」ピクセルまで広げます。

ルーラーをドラッグ
ルーラーをドラッグ

 (3)上から2行のヘッダセルを幅一杯までドラッグします。

ヘッダセルを幅一杯までドラッグ
ヘッダセルを幅一杯までドラッグ

 (4)ツールボックスからHeaderCellを白血球数の横にドラッグアンドドロップします。 そして、プロパティウィンドウでValueプロパティに「赤血球数」と入力します。

HeaderCellを白血球数の横にドラッグアンドドロップ
HeaderCellを白血球数の横にドラッグアンドドロップ
Valueプロパティに「赤血球数」と入力
Valueプロパティに「赤血球数」と入力

 (5)もともとあったヘッダ「赤血球数」の横にある「NmericUpDownCell」を、今配置したヘッダセルの横にドラッグします。これで、レコードのフィールドデータは連結したまま、表示を2列に変更できました。

「NmericUpDownCell」をヘッダセルの横にドラッグアンドドロップ
「NmericUpDownCell」をヘッダセルの横にドラッグアンドドロップ

 (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などでデータを見ることができます。

Visual Basic
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
C#
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);
    }
}
アプリケーション完成画面
アプリケーション完成画面
保存されたCSV形式のデータをExcelで開く
保存されたCSV形式のデータをExcelで開く

まとめ

 GcMultiRowコントロールは、複雑な形式の日本の帳票を作成するアプリケーションにぴったりのコントロールです。今回は取り上げませんでしたが、セルの入力規則や装飾機能、スタイル設定にマージやセル幅の自動調節機能など、帳票をデザインするのに必要な、かつプログラマの労力を補助してくれる多くの優秀な機能を持っています。

 そのような中、限られた誌面の中でデータ連結とレコードの水平展開機能、CSVファイルへのエクスポート機能を取り上げて紹介しました。特に時系列データの表示については水平方向にデータを並べたほうがよりわかりやすいデータ表現になりますから、GcMultiRowコントロールの列方向へのデータ展開機能はとても適した機能といえます。また、アプリケーションの作成でも紹介したように、水平方向へのデータ展開がウィザードなどを使って簡単に実装できる点も、開発サイドの負担軽減につながると言えるでしょう。

 もし帳票作成アプリケーションの設計にお悩みでしたら、GcMultiRowコントロールをアプリケーションに加えてみてはいかがでしょうか。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9049 2015/11/16 16:37

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング