SHOEISHA iD

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

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

ComponentZine(PlusPak)(AD)

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

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

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

データベースの操作~その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コントロールを使うことでいろいろなデータを効率よく表示できます。

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

製品情報

修正履歴

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

  • このエントリーをはてなブックマークに追加
ComponentZine(PlusPak)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4843 2010/02/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング