コードの作成
フォームのデザインができたら、各イベントハンドラにコードを作成していきます。
メインの処理は2つのButtonコントロールのClickイベントハンドラで、クエリ実行の処理を行います。
C1TrueDBGridコントロールの重要な機能の一つとして、実行時にデータベースに対する変更を自動的に検出できる機能があります。例えば、実行時に操作対象のデータセットが変更された場合、自動的にそれに対応してグリッドの行と列を変更し、データを表示します。設計時に列のプロパティを特に定義しなくても、グリッドが自動的にフィールドレイアウトの変更に応答します。
そこでこの機能を用いて、実行時にクエリーを実行し、結果セットをグリッドに表示する処理を実装します。実装はとても簡単で、クエリ文字列を作成し、数行のコードを書くだけです。
C1TrueDBGridコントロールは2つ配置し、1つは常にデータベースデータを全件表示します。もう一つのC1TrueDBGridコントロールはクエリの結果セットを表示します。こうすることで、ユーザーは全件データを見ながら必要なデータ抽出を行うことができます。
フォームのLoadイベントハンドラの処理
Loadイベントハンドラでは、グリッドの「ID」列の列幅を自動的に設定する処理と、ComboBoxコントロールのドロップダウンリストに、リスト項目の先頭の項目をセットする処理を記述します。
列幅の自動設定は、列ごとに行います。まず、Splitsプロパティを使用して、操作対象のSplitオブジェクトを指定します。このグリッドではスプリットを使用していませんので、Splitオブジェクトは1つしかないため引数には(0,0)を指定します。
そして、DisplayColumnsプロパティでC1DisplayColumnオブジェクトを指定します。サイズ変更をするのは最初の列なので、引数には列番号「0」を指定し、AllowSizingプロパティをTrueに設定します。これで列幅の変更が可能になります。続いて、AutoSizeメソッドを実行します。このメソッドが、列幅をデータの長さに合わせて設定してくれます。
Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを '平成23年度秋冬野菜収穫量_DataDataSet.収穫量一覧' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.収穫量一覧TableAdapter.Fill(Me.平成23年度秋冬野菜収穫量_DataDataSet.収穫量一覧) '列「ID」のみ列幅を自動調節 C1TrueDBGrid1.Splits(0, 0).DisplayColumns(0).AllowSizing = True C1TrueDBGrid1.Splits(0, 0).DisplayColumns(0).AutoSize() C1TrueDBGrid2.Splits(0, 0).DisplayColumns(0).AllowSizing = True C1TrueDBGrid2.Splits(0, 0).DisplayColumns(0).AutoSize() 'ドロップダウンリストにリストの先頭項目を表示 ComboBox1.SelectedIndex = 0 ComboBox2.SelectedIndex = 0 End Sub
using System.Data.SqlClient; namespace trueDB_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: このコード行はデータを '平成23年度秋冬野菜収穫量_DataDataSet.収穫量一覧' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 this.収穫量一覧TableAdapter.Fill(this.平成23年度秋冬野菜収穫量_DataDataSet.収穫量一覧); //列「ID」のみ列幅を自動調節 c1TrueDBGrid1.Splits[0, 0].DisplayColumns[0].AllowSizing = true; c1TrueDBGrid1.Splits[0, 0].DisplayColumns[0].AutoSize(); c1TrueDBGrid2.Splits[0, 0].DisplayColumns[0].AllowSizing = true; c1TrueDBGrid2.Splits[0, 0].DisplayColumns[0].AutoSize(); //ドロップダウンリストにリストの先頭項目を表示 comboBox1.SelectedIndex = 0; comboBox2.SelectedIndex = 0; }
SQL文を直接入力するクエリ処理の作成
次に、SQL文を直接入力してクエリを実行する処理を作成します。この処理は、Buttonコントロール「Button1」のClickイベントハンドラで行います。
(1)TextBoxコントロールからSQL文を取得します。
(2)SqlDataAdapterオブジェクトを作成します。操作対象のデータベースがSQL Serverの場合は、System.Data.SqlClient名前空間にあるSqlDataAdapterクラスを使用します。コンストラクタの引数は、クエリ文字列と接続文字列です。接続文字列は、収穫量一覧TableAdapterオブジェクトのConnectionプロパティから取得します。
(3)DataSetオブジェクトを作成し、SqlDataAdapterクラスのFillメソッドを実行します。引数はDataSetオブジェクトへの参照とテーブル名です。ここでは、「クエリー結果」というテーブル名を使用します。これで、クエリが実行され結果セットがDataSetオブジェクトに格納されます。
(4)「C1TrueDBGrid2」のDataSourceプロパティを空にし、ClearFieldsメソッドでフィールドをクリアして、DataSourceプロパティにDataSetオブジェクトのテーブル「クエリー結果」を設定します。
これで、2つ目のC1TrueDBGridコントロールにクエリ結果が表示されます。
(5)グリッドのデータが入れ替わりましたので、再度ID列の列幅を自動設定にし、列「収穫量(t)」のグラデーションをコードから設定します。列幅の自動設定はAutoSizeメソッドを実行します。
列のグラデーションでの塗りつぶしは、C1DisplayColumnクラスの下層に位置するStyleクラスのメンバを使用します。
列の指定は列幅の自動設定と同じようにSplitsプロパティとDisplayColumnsプロパティを使用しますが、操作対象の列の指定に列番号ではなく列見出しを使うこともできます。こちらの方が、どの列を操作するのかすぐに分かって便利です。
あとは、GradientMode、BackColor、BackColor2プロパティを使用してグラデーションの2色と方向を設定します。
プログラムを実行し、TextBoxコントロールに入力されているSQL文のまま「実行」ボタンをクリックすると、下のC1TrueDBGridコントロールにクエリ結果が表示されます。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'SQL文字列の作成とDataAdapterの作成 Dim sqlStr As String = TextBox1.Text '(1) Dim adapter As New SqlDataAdapter(sqlStr, Me.収穫量一覧TableAdapter.Connection) '(2) 'DataSetオブジェクトの作成 Dim ds As DataSet = New DataSet() '(3) ds.Clear() 'クエリを実行し結果セットをC1TrueDBGrid2のDataSourceプロパティに設定 Try adapter.Fill(ds, "クエリー結果") C1TrueDBGrid2.DataSource = Nothing '(4) C1TrueDBGrid2.ClearFields() C1TrueDBGrid2.DataSource = ds.Tables("クエリー結果") Catch ex As Exception MessageBox.Show("SQL文のエラー") End Try '列「ID」のみ列幅を自動調節 (5) C1TrueDBGrid2.Splits(0, 0).DisplayColumns(0).AutoSize() 'グラデーションの設定 C1TrueDBGrid2.Splits(0).DisplayColumns("収穫量(t)").Style.GradientMode = C1.Win.C1TrueDBGrid.GradientModeEnum.ForwardDiagonal C1TrueDBGrid2.Splits(0).DisplayColumns("収穫量(t)").Style.BackColor = Color.Orange C1TrueDBGrid2.Splits(0).DisplayColumns("収穫量(t)").Style.BackColor2 = Color.BlanchedAlmond End Sub
private void button1_Click(object sender, EventArgs e) { //SQL文字列の作成とDataAdapterの作成 string sqlStr = textBox1.Text; //(1) SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, 収穫量一覧TableAdapter.Connection); //(2) //DataSetオブジェクトの作成 DataSet ds = new DataSet(); //(3) ds.Clear(); //クエリを実行し結果セットをC1TrueDBGrid2のDataSourceプロパティに設定 try{ adapter.Fill(ds, "クエリー結果"); c1TrueDBGrid2.DataSource = null; //(4) c1TrueDBGrid2.ClearFields(); c1TrueDBGrid2.DataSource = ds.Tables["クエリー結果"]; }catch{ MessageBox.Show("SQL文のエラー"); } //列「ID」のみ列幅を自動調節 (5) c1TrueDBGrid2.Splits[0, 0].DisplayColumns[0].AutoSize(); //グラデーションの設定 c1TrueDBGrid2.Splits[0].DisplayColumns["収穫量(t)"].Style.GradientMode = C1.Win.C1TrueDBGrid.GradientModeEnum.ForwardDiagonal; c1TrueDBGrid2.Splits[0].DisplayColumns["収穫量(t)"].Style.BackColor = Color.Orange; c1TrueDBGrid2.Splits[0].DisplayColumns["収穫量(t)"].Style