SHOEISHA iD

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

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

ComponentZine(ComponentOne)

グリッドコントロールを使いデータベースを操作する.NETアプリケーションを作る

「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールを使った.NETアプリケーションの作成

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

コードの作成

 フォームのデザインができたら、各イベントハンドラにコードを作成していきます。

 メインの処理は2つのButtonコントロールのClickイベントハンドラで、クエリ実行の処理を行います。

 C1TrueDBGridコントロールの重要な機能の一つとして、実行時にデータベースに対する変更を自動的に検出できる機能があります。例えば、実行時に操作対象のデータセットが変更された場合、自動的にそれに対応してグリッドの行と列を変更し、データを表示します。設計時に列のプロパティを特に定義しなくても、グリッドが自動的にフィールドレイアウトの変更に応答します。

 そこでこの機能を用いて、実行時にクエリーを実行し、結果セットをグリッドに表示する処理を実装します。実装はとても簡単で、クエリ文字列を作成し、数行のコードを書くだけです。

 C1TrueDBGridコントロールは2つ配置し、1つは常にデータベースデータを全件表示します。もう一つのC1TrueDBGridコントロールはクエリの結果セットを表示します。こうすることで、ユーザーは全件データを見ながら必要なデータ抽出を行うことができます。

フォームのLoadイベントハンドラの処理

 Loadイベントハンドラでは、グリッドの「ID」列の列幅を自動的に設定する処理と、ComboBoxコントロールのドロップダウンリストに、リスト項目の先頭の項目をセットする処理を記述します。

 列幅の自動設定は、列ごとに行います。まず、Splitsプロパティを使用して、操作対象のSplitオブジェクトを指定します。このグリッドではスプリットを使用していませんので、Splitオブジェクトは1つしかないため引数には(0,0)を指定します。

 そして、DisplayColumnsプロパティでC1DisplayColumnオブジェクトを指定します。サイズ変更をするのは最初の列なので、引数には列番号「0」を指定し、AllowSizingプロパティをTrueに設定します。これで列幅の変更が可能になります。続いて、AutoSizeメソッドを実行します。このメソッドが、列幅をデータの長さに合わせて設定してくれます。

Visual Basic
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
C#
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;
        }
ID列のみ列幅がデータに合わせられる
ID列のみ列幅がデータに合わせられる

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コントロールにクエリ結果が表示されます。

プログラムの実行結果
プログラムの実行結果
Visual Basic
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
C#
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

次のページ
まとめ

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

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

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6900 2012/12/12 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング