データベースの操作~その2
結果セットの表示
クエリが無事実行されると、取得したデータをFillメソッドの引数に指定したDataSetオブジェクトに格納するので、後はこれを取り出して表示するだけです。
データは、新しいタブページを作成し、その上にVisual Studio標準コントロールのDataGridViewコントロールを作成して表示します。新しいタブページの作成は前回の記事でも紹介したように、GcTabControlコントロールのTabPagesコレクションにAddメソッドを用いてTabPageオブジェクトを追加します。そして、Textプロパティでタブに文字を表示します。
また、DataSetオブジェクトのTablesプロパティでクエリ結果セットのデータテーブルを取得し、RowsオブジェクトのCountプロパティを参照すると、クエリで何件のデータを取得できたかを知ることができるので、これもタブに表示します。
Dim newpage As New GcTabPage Dim dataview As New DataGridView GcTabControl1.TabPages.Add(newpage) newpage.Text = title & ":抽出結果" & myDataSet.Tables(0).Rows.Count & "件"
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プロパティでタブの幅と高さを設定します。これらの設定をきちんと実施しておかないと、タブの表示文字列がきれいに表示されません。
GcTabControl1.SizeMode = GrapeCity.Win.Containers.TabSizeMode.Fixed GcTabControl1.TabStyle.ItemSize = New Size(130, 50) GcTabControl1.TabStyle.WrapMode = GrapeCity.Win.Common.TextWrapMode.WordWrap
gcTabControl1.SizeMode = GrapeCity.Win.Containers.TabSizeMode.Fixed; gcTabControl1.TabStyle.ItemSize = new Size(130, 50); gcTabControl1.TabStyle.WrapMode = GrapeCity.Win.Common.TextWrapMode.WordWrap;
次に、作成したクエリが分かりやすいように、タブページの背景色を変えます。誤読を防ぐ機能としても有効でしょう。これは、プロシージャ(メソッド)の引数「pos」を使用し、算術演算子の「剰余演算子」で変数の値が偶数か奇数かを判別し、それぞれの場合で違う背景色になるように設定します。
If (pos Mod 2) = 0 Then newpage.BackColor = Color.SandyBrown Else newpage.BackColor = Color.LightGreen End If
if((pos % 2) == 0) { newpage.BackColor = Color.SandyBrown; }else { newpage.BackColor = Color.LightGreen; }
メンバ名 | 説明 |
---|---|
NotSet | ラップモードは自動的に決定します。 |
NoWrap | 矩形内の書式指定時に、行間のテキストのラップを無効にします。 |
WordWrap | テキストを最も近い単語に整えるよう指定します。 |
CrLfWrap | テキストをCrLfに整えるよう指定します。 |
メンバ名 | 説明 |
---|---|
Normal | 各タブの幅は表示される内容に合わせて設定されます。1行内にある複数のタブのサイズは、コンテナコントロールの幅に合わせて調整されません。 |
Fixed | コントロール内のタブの幅はすべて同じです。サイズはTabSizeプロパティで指定します。 |
FillToRight | 各タブの幅は、複数のタブの各行の幅を合わせるとコンテナコントロール全体の幅になるように設定されます。 |
続いて、DataGridViewコントロールのインスタンスを作成し、TabPageオブジェクトに組み込みます。サイズと配置場所を設定し、DataSourceプロパティにDataSetオブジェクトを設定して、DataMemberプロパティにはOleDbDataAdapterのFillメソッドを実行した際に設定したDataSetオブジェクトの名前を設定します。これで、クエリの結果セットをDataGridViewコントロールで表示できます。
さらに、Labelコントロールのインスタンスも作成してページに見出しをつけ、タブページをドラッグ&ドロップで移動できるように、GcTabControlコントロールのAllowDragDropプロパティを「True」にします。
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
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コントロールが追加され、クエリの結果セットが表示されます。
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
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コントロールを使うことでいろいろなデータを効率よく表示できます。
タブの位置も使い方に合わせて設定することができ、形状もカスタマイズできるので、アプリケーションのデザインに関する自由度も高くなります。