CodeZine(コードジン)

特集ページ一覧

タブページでクエリ結果を表示する.NETアプリケーションを作る

PlusPak for Windows Forms 6.0JのGcTabControlコントロールを使ったアプリケーションの作成~その2

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

 PlusPak for Windows Forms 6.0JのGcTabControlは、タブの形状をいろいろな形にデザインしたり様々な機能を実装できる便利なコントロールです。今回は、Accessのデータベースからクエリを実行し、その結果をタブページに表示するアプリケーションを作成していきます。

はじめに

 前回の記事「IE8風タブページのスケジューラ機能を持った.NETアプリケーションを作る」に引き続き、GcTabControlコントロールを使ったアプリケーションを作成します。

 今回は、Accessのデータベースからクエリを実行し、その結果をタブページに表示します。タブページとデータを表示するDataGridViewはすべてコードから作成し、クエリの実行結果をその都度タブページで表示します。

 クエリを実行するたびにタブページで結果を表示するので、フォーム上の場所も取らず、タブページも[閉じる]ボタンで閉じることができるので、狭いフォームを有効に使うことができるアプリケーションです。また、タブのテキスト情報を複数行で表示し、タブごとに背景色を変えることで、情報を整理して誤読を防ぐようにします。

メニューでクエリを選ぶと
メニューでクエリを選ぶと
実行結果をタブページで表示する
実行結果をタブページで表示する

対象読者

 Visual Basic/Visual C# 2005・2008を使ってプログラムを作ったことのある人。

必要な環境

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

プログラム実行時の注意事項

 PlusPak for Windows Forms 6.0Jを使って作成したアプリケーションを配布する場合、PlusPak for Windows Forms 6.0Jのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。

 本記事のサンプルアプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。

ファイル名 説明
GrapeCity.Win.PlusPak.v60.dll 本体コンポーネント
GrapeCity.Framework.PlusPak.v21.dll 製品のフレームワーク
ja\GrapeCity.Win.PlusPak.v60.resources.dll 本体コンポーネントのサテライトリソース
ja\GrapeCity.Framework.PlusPak.v21.resources.dll 製品フレームワークのサテライトリソース

 これらのファイルを、プログラムを実行するフォルダにフォルダ構成を変えずに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0以上のバージョンの.NET Frameworkがインストールされていることが必須条件です。

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

 はじめてPlusPak for Windows Forms 6.0Jを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にPlusPak for Windows Forms 6.0Jをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできます。製品ページの[ダウンロード]タブをクリックしてダウンロード専用ページに移動したら、「PlusPak for Windows Forms 6.0J」の[申込フォーム]をクリックします。

 「トライアル版お申し込みフォーム」に必要事項を入力して登録すると、添付トライアルライセンスキーファイルとダウンロードサイトのURLを記載したE- Mailが送られてくるので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 PlusPak for Windows Forms 6.0Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコントロールを追加します。追加するコンポーネントは、アセンブリ名が「GrapeCity.Win.PlusPak.v60」で始まる「GcTabControl」コントロールです。

アセンブリ名が「GrapeCity.Win.PlusPak.v60」で始まる「GcTabControl」コントロールを選択する
アセンブリ名が「GrapeCity.Win.PlusPak.v60」で始まる「GcTabControl」コントロールを選択する

GUIのデザイン

 あらかじめ作成するコントロールは、GcTabControlコントロールとMenuStripコントロールです。タブページであるGcTabPageコントロールと、その上に配置するDataGridViewコントロール、Labelコントロールはすべて実行時にコードから作成します。

フォームデザイン完了時のGUIのデザイン
フォームデザイン完了時のGUIのデザイン
プログラム実行時のGUIのデザイン
プログラム実行時のGUIのデザイン

フォームのデザイン

 このプログラムは『データベースのテーブルにあるデータをグループ化して取り出し、その金額を集計して合計や平均を算出後、タブページに表示する』というものです。クエリは、簡単な集計クエリを2つ実行し、実行のトリガーにはメニューを使用します。

 フォームにMenuStripコントロールを配置し、[Dock]プロパティを「Top」に設定します。MenuStripコントロールに設定するメニューは、次の3つです。

  • データの抽出
  • メーカーごとの合計
  • メーカーごとの平均

GcTabControlコントロールのデザイン

 フォームにGcTabControlコントロールを配置し、[Dock]プロパティを「Fill」に設定します。GcTabControlコントロールのスマートタグからデザイナを起動し、タブページのデザインをします。

  1. まず、タブスタイルを「丸型」にして、配置はタブ位置を「下側」にします。また、タブ間隔を「5」にします。
  2. [閉じる]ボタンおよびホットトラックを設定します。[閉じる]ボタンは「マウスホバーの場合に表示」にし、ホットトラックは「ハイライト」にします。
  3. メニューアイコンが使用できるように「CommandIconList」の下にある「MenuIcon」の「Visible」プロパティを「True」にし、アイコン「Windows.jpg」を設定します。 
    ここまでの設定を実施したGcTabControlコントロール
    ここまでの設定を実施したGcTabControlコントロール
  4. MenuStripコントロールがGcTabControlコントロールよりも前面にくるように、GcTabControlコントロールを「最前面」に設定します。
    GcTabControlコントロールを最前面にしておく
    GcTabControlコントロールを最前面にしておく

 すべての設定を行ったら、[TabPages]プロパティをクリックしてコレクションエディタを表示し、タブページをすべて削除します。

データベースの操作~その1

 データベースへの接続、クエリの実行、結果セットの表示はすべてコードから作成しますが、データベースファイルはプロジェクトに組み込んでおきます。使用するデータベースは、「ギター販売集計.mdb」というMicrosoft Accessで作成したデータベースで、「製品リスト」という簡単なテーブルを操作対象にします。

使用するデータベースのテーブル
使用するデータベースのテーブル

 このデータベースを、データベース構成ウィザードでプロジェクトに組み込んでおきます(コピーを出力しておくようにします)。

プロジェクトに組み込む
プロジェクトに組み込む

データ接続とクエリの実行処理

 データベースファイルをプロジェクトへ組み込んだら、OLEDBプロバイダを用いてデータベースに接続しクエリを実行します。この作業は、次の順序で行います。

  1. OleDbConnectionクラスのインスタンスを作成し、データベースに接続します。
  2. OleDbDataAdapterクラスとDataSetクラスのインスタンスを作成し、クエリ用文字列を用いて、OleDbDataAdapterクラスのFillメソッドでクエリを実行。そして、実行結果のデータテーブルをDataSetクラスのインスタンスに格納します。

 このプログラムでは、クエリ用SQL文字列を変えることで、いろいろなパターンのクエリが実行できるように、専用のプロシージャ(C#ではメソッド)を作成します。作成するプロシージャ(メソッド)は「db_run」で、sql文字列とタブページに表示するタイトル文字列、実行するクエリの番号(任意の数字)の3つを引数に持ちます。

 データベースはAccessのデータファイルなので、OLEDBプロバイダは「Microsoft.Jet.OLEDB.4.0」を使用します。接続するデータベースファイルは、既にプロジェクトに組み込んでいるので、ファイル名だけ指定します。

Visual Basic
Imports GrapeCity.Win.Containers
Public Class Form1

    Private Sub db_run(ByVal sqlstr As String, ByVal title As String, ByVal pos As Integer)
        Dim connString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", "ギター販売集計.mdb")
        Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(connString)
        Dim adapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sqlstr, conn)
        Dim myDataSet As DataSet = New DataSet()
        adapter.Fill(myDataSet, "fill")
C#
using GrapeCity.Win.Containers;

namespace tabdb_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void db_run(string sqlstr, string title, int pos)
        {
            string connString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", "ギター販売集計.mdb");
            System.Data.OleDb.OleDbConnection conn  = new System.Data.OleDb.OleDbConnection(connString);
            System.Data.OleDb.OleDbDataAdapter adapter  = new System.Data.OleDb.OleDbDataAdapter(sqlstr, conn);
            DataSet myDataSet = new DataSet();
            adapter.Fill(myDataSet, "fill");

データベースの操作~その2

結果セットの表示

 クエリが無事実行されると、取得したデータをFillメソッドの引数に指定したDataSetオブジェクトに格納するので、後はこれを取り出して表示するだけです。

 データは、新しいタブページを作成し、その上にVisual Studio標準コントロールのDataGridViewコントロールを作成して表示します。新しいタブページの作成は前回の記事でも紹介したように、GcTabControlコントロールのTabPagesコレクションにAddメソッドを用いてTabPageオブジェクトを追加します。そして、Textプロパティでタブに文字を表示します。

 また、DataSetオブジェクトのTablesプロパティでクエリ結果セットのデータテーブルを取得し、RowsオブジェクトのCountプロパティを参照すると、クエリで何件のデータを取得できたかを知ることができるので、これもタブに表示します。

Visual Basic
Dim newpage As New GcTabPage
Dim dataview As New DataGridView

GcTabControl1.TabPages.Add(newpage)
newpage.Text = title & ":抽出結果" & myDataSet.Tables(0).Rows.Count & "件"
C#
GcTabPage newpage = new GcTabPage();
DataGridView dataview = new DataGridView();

gcTabControl1.TabPages.Add(newpage);
newpage.Text = title + ":抽出結果" + myDataSet.Tables[0].Rows.Count + "件";

タブページのカスタマイズ

 新しいタブページを追加したら、ここでタブページを加工します。1つは、タブに表示する文字を複数行に分けて表示するようにします。これは、GcTabControlクラスの下層に位置するTabStyleクラスにあるWrapModeプロパティに、TextWrapMode列挙体のメンバ「WordWrap」を設定します。

 その前に、タブのサイズを複数行表示可能なサイズにしておきます。これは、GcTabControlクラスのSizeModeプロパティをTabSizeMode列挙体のメンバ「Fixed」に設定し、TabStyleクラスのItemSizeプロパティでタブの幅と高さを設定します。これらの設定をきちんと実施しておかないと、タブの表示文字列がきれいに表示されません。

Visual Basic
GcTabControl1.SizeMode = GrapeCity.Win.Containers.TabSizeMode.Fixed
GcTabControl1.TabStyle.ItemSize = New Size(130, 50)
GcTabControl1.TabStyle.WrapMode = GrapeCity.Win.Common.TextWrapMode.WordWrap
C#
gcTabControl1.SizeMode = GrapeCity.Win.Containers.TabSizeMode.Fixed;
gcTabControl1.TabStyle.ItemSize = new Size(130, 50);
gcTabControl1.TabStyle.WrapMode = GrapeCity.Win.Common.TextWrapMode.WordWrap;

 次に、作成したクエリが分かりやすいように、タブページの背景色を変えます。誤読を防ぐ機能としても有効でしょう。これは、プロシージャ(メソッド)の引数「pos」を使用し、算術演算子の「剰余演算子」で変数の値が偶数か奇数かを判別し、それぞれの場合で違う背景色になるように設定します。

Visual Basic
If (pos Mod 2) = 0 Then
    newpage.BackColor = Color.SandyBrown
Else
    newpage.BackColor = Color.LightGreen
End If
C#
if((pos % 2) == 0)
{
    newpage.BackColor = Color.SandyBrown;
}else
{
    newpage.BackColor = Color.LightGreen;
}
TextWrapMode列挙体のメンバ
メンバ名 説明
NotSet ラップモードは自動的に決定します。
NoWrap 矩形内の書式指定時に、行間のテキストのラップを無効にします。
WordWrap テキストを最も近い単語に整えるよう指定します。
CrLfWrap テキストをCrLfに整えるよう指定します。
TabSizeMode列挙体のメンバ
メンバ名 説明
Normal 各タブの幅は表示される内容に合わせて設定されます。1行内にある複数のタブのサイズは、コンテナコントロールの幅に合わせて調整されません。
Fixed コントロール内のタブの幅はすべて同じです。サイズはTabSizeプロパティで指定します。
FillToRight 各タブの幅は、複数のタブの各行の幅を合わせるとコンテナコントロール全体の幅になるように設定されます。

 続いて、DataGridViewコントロールのインスタンスを作成し、TabPageオブジェクトに組み込みます。サイズと配置場所を設定し、DataSourceプロパティにDataSetオブジェクトを設定して、DataMemberプロパティにはOleDbDataAdapterのFillメソッドを実行した際に設定したDataSetオブジェクトの名前を設定します。これで、クエリの結果セットをDataGridViewコントロールで表示できます。

 さらに、Labelコントロールのインスタンスも作成してページに見出しをつけ、タブページをドラッグ&ドロップで移動できるように、GcTabControlコントロールのAllowDragDropプロパティを「True」にします。

Visual Basic
    newpage.Controls.Add(dataview)

    dataview.Size = New Size(300, 220)
    dataview.Location = New Point(120, 50)
    dataview.DataSource = myDataSet
    dataview.DataMember = "fill"

    Dim lb As Label = New Label()
    lb.Text = title
    lb.Location = New Point(20, 20)
    lb.Font = New Font(Me.Font.FontFamily, 12)
    lb.AutoSize = True
    lb.BackColor = Color.Transparent

    newpage.Controls.Add(lb)

    GcTabControl1.AllowDragDrop = True
End Sub
C#
    adapter.Fill(myDataSet, "fill");

    GcTabPage newpage = new GcTabPage();
    DataGridView dataview = new DataGridView();

    gcTabControl1.TabPages.Add(newpage);
    newpage.Text = title + ":抽出結果" + myDataSet.Tables[0].Rows.Count + "件";
    newpage.Controls.Add(dataview);

    dataview.Size = new Size(300, 220);
    dataview.Location = new Point(120, 50);
    dataview.DataSource = myDataSet;
    dataview.DataMember = "fill";

    Label lb = new Label();
    lb.Text = title;
    lb.Location = new Point(20, 20);
    lb.Font = new Font(this.Font.FontFamily, 12);
    lb.AutoSize = true;
    lb.BackColor = Color.Transparent;

    newpage.Controls.Add(lb);

    gcTabControl1.AllowDragDrop = true;
}

クエリの実行処理

 クエリ処理のプロシージャ(メソッド)ができたら、メニューのイベントハンドラでそれぞれ合計と平均を算出する集計クエリを実行します。

 まず、実行したいクエリのSQL文字列を作成します。次に、クリックされたToolStripMenuItemオブジェクトのTextプロパティから、メニューの項目名を取得します。そして、これらを引数にプロシージャ(メソッド)db_runを実行します。

 後は、プロシージャ(メソッド)の処理で、タブページとDataGridViewコントロールが追加され、クエリの結果セットが表示されます。

Visual Basic
Private Sub メーカーごとの合計ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles メーカーごとの合計ToolStripMenuItem.Click
    Dim sql_str As String = "SELECT DISTINCTROW 製品リスト.[メーカー], Sum(製品リスト.税込価格) " & _
    "AS [合計金額] FROM(製品リスト)" & _
    "GROUP BY 製品リスト.[メーカー];"

    Dim menuitem As ToolStripMenuItem = sender
    Dim title As String = menuitem.Text
    db_run(sql_str, title, 1)
End Sub


Private Sub メーカーごとの平均ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles メーカーごとの平均ToolStripMenuItem.Click
    Dim sql_str As String = "SELECT DISTINCTROW 製品リスト.[メーカー], Avg(製品リスト.税込価格) " & _
    "AS [平均金額] FROM(製品リスト)" & _
    "GROUP BY 製品リスト.[メーカー];"

    Dim menuitem As ToolStripMenuItem = sender
    Dim title As String = menuitem.Text
    db_run(sql_str, title, 2)
End Sub
C#
    private void メーカーごとの合計ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        string sql_str = "SELECT DISTINCTROW 製品リスト.[メーカー], Sum(製品リスト.税込価格) " +
             "AS [合計金額] FROM(製品リスト)" +
             "GROUP BY 製品リスト.[メーカー];";

        ToolStripMenuItem menuitem = (ToolStripMenuItem)sender;
        string title = menuitem.Text;
        db_run(sql_str, title, 1);
    }

    private void メーカーごとの平均ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        string sql_str = "SELECT DISTINCTROW 製品リスト.[メーカー], Avg(製品リスト.税込価格) " +
                         "AS [平均金額] FROM(製品リスト)" +
                         "GROUP BY 製品リスト.[メーカー];";

        ToolStripMenuItem menuitem = (ToolStripMenuItem)sender;
        string title  = menuitem.Text;
        db_run(sql_str, title, 2);
    }
}

まとめ

 今回はメニューからクエリでデータを取り出し、タブページで表示する方法をとりました。このほかにも、複雑な抽出条件でのクエリ実行用に最初のタブページをクエリ用の画面にしたり、抽出結果を別のタブページで表示したり、レコード編集専用のタブページを設定するなど、1つのアプリケーションにいくつものページを設定して使い分けることができるため、GcTabControlコントロールを使うことでいろいろなデータを効率よく表示できます。

 タブの位置も使い方に合わせて設定することができ、形状もカスタマイズできるので、アプリケーションのデザインに関する自由度も高くなります。

製品情報

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

修正履歴

  • 2010/01/22 16:07 校正終了-瀬戸

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

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

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