連載:Windowsフォーム開発入門【Visual Studio 2010対応】

Windowsフォームにおける「データ・バインディング」

初音 玲
2010/11/16
Page1 Page2 Page3

(2)データ・バインディングで「現在行のデータを表示」

 TextBoxコントロールにXMLファイルの内容を表示するサンプルを用いて、データ・バインディングで1行のデータを表示する方法を説明する。

 今回作成したサンプルは、下記のリンクからダウンロードできる。

Windowsフォーム画面をデザインする

図5 1行表示のWindowsフォーム画面デザイン例

 XMLファイルの1行分のデータを表示するWindowsフォーム画面デザインとして図5のようなデザインを考えてみた。

 (メニューバーの)[ファイル]メニューには、[開く]や[保存]などのサブメニューがあり、XMLファイルとの入出力が行える。

 各TextBoxコントロールと各CheckBoxコントロールがデータセットに読み込まれたXMLファイルの内容を表示するコントロールであり、これらのコントロールにデータ・バインディング行う。

 Windowsフォーム画面の最下部にあるバー(コンポーネント・トレイのことではない)は、データ・バインディングしたデータの現在行を移動するためのBindingNavigatorコントロール(変数名は「XML_ BindingNavigator」)だ。TextBoxコントロールやCheckBoxコントロールに表示されるデータは、現在行のデータになるので、BindingNavigatorコントロール(上にある左向きや右向きの三角ボタンなど)を操作することで、表示が次々と変わっていく。

 なお、BindingNavigatorコントロールのBindingSourceプロパティにはBindingSourceコンポーネント(サンプルでは「XML_BindingSource」という変数)を設定して、BindingNavigatorコントロールと対象となるデータ・バインディングをひも付けて(=バインディングして)おく必要がある。

データ・バインディングを実装する

 今回のサンプル・プログラムでは、(メニューバーの)[ファイル]−[開く]メニューを選択すると、XMLファイルから読み込んだデータを、各コントロールに表示する(図6を参照)。

図6 各TextBox/CheckBoxコントロールに現在行のデータを表示するサンプルの実行例

Private block As Object = Nothing
Private DataFileName As String = _
  System.IO.Path.Combine(Application.StartupPath, "data.xml")
Private Ds As New DataSet

Private Sub FileOpenToolStripMenuItem_Click( _
                      ByVal sender As Object, _
                      ByVal e As EventArgs) _
                    Handles FileOpenToolStripMenuItem.Click
  Me.Cursor = Cursors.WaitCursor
  Me.Refresh()

  Try
    Ds.Tables.Clear()

    ' XMLファイルからデータセットに読み込み
    Ds.ReadXml(DataFileName)
    Ds.Tables("data").AcceptChanges()
    Me.XML_BindingSource.DataSource = Ds.Tables("data")

    With block
      Me.Date_TextBox.DataBindings.Add(New Binding( _
                             "Text", _
                             Me.XML_BindingSource, _
                             "日付", _
                             True))
      Me.Title_TextBox.DataBindings.Add(New Binding( _
                             "Text", _
                             Me.XML_BindingSource, _
                             "タイトル", _
                             True))
      Me.URL_TextBox.DataBindings.Add(New Binding( _
                             "Text", _
                             Me.XML_BindingSource, _
                             "URL", _
                             True))
      Me.VB_CheckBox.DataBindings.Add(New Binding( _
                             "CheckState", _
                             Me.XML_BindingSource, _
                             "vb", _
                             True))
      Me.Oracle_CheckBox.DataBindings.Add(New Binding( _
                             "CheckState", _
                             Me.XML_BindingSource, _
                             "oracle", _
                             True))
    End With

    Me.FileSaveToolStripMenuItem.Enabled = True
  Catch ex As Exception
    MessageBox.Show(ex.Message, Me.Text)
  Finally
    Me.Cursor = Cursors.Default
  End Try
End Sub
private string DataFileName =
  System.IO.Path.Combine(Application.StartupPath, "data.xml");
private DataSet Ds = new DataSet();

public BindingNavigator_Form()
{
  InitializeComponent();
}

private void FileOpenToolStripMenuItem_Click(object sender, EventArgs e)
{
  Ds.Tables.Clear();

  // XMLファイルからデータセットに読み込み
  Ds.ReadXml(DataFileName);
  Ds.Tables["data"].AcceptChanges();
  this.XML_BindingSource.DataSource = Ds.Tables["data"];

  {
    this.Date_TextBox.DataBindings.Add(new Binding(
                            "Text",
                            this.XML_BindingSource,
                            "日付",
                            true));
    this.Title_TextBox.DataBindings.Add(new Binding(
                            "Text",
                            this.XML_BindingSource,
                            "タイトル",
                            true));
    this.URL_TextBox.DataBindings.Add(new Binding(
                            "Text",
                            this.XML_BindingSource,
                            "URL",
                            true));
    this.VB_CheckBox.DataBindings.Add(new Binding(
                            "CheckState",
                            this.XML_BindingSource,
                            "vb",
                            true));
    this.Oracle_CheckBox.DataBindings.Add(new Binding(
                            "CheckState",
                            this.XML_BindingSource,
                            "oracle",
                            true));
  }

  this.FileSaveToolStripMenuItem.Enabled = true;
}
リスト5 データセットの「data」データテーブルの内容を1レコード分画面に表示するコード(上:VB、下:C#)

 データセットにXMLファイルの内容を読み込んだら、AcceptChangesメソッドを実行して、全行のRowStateプロパティの値を「Add」から「Unchanged」にする。

 データセットのデータテーブルを、BindingSourceコンポーネントのデータソースとして指定する。これでデータテーブルとBindingSourceコンポーネントがデータ・バインディングできたことになる。

 次に、各コントロールのDataBindingsコレクション・プロパティにBindingSourceコンポーネント(=データセットとの仲介役)を割り当てていく(=バインディング)。例えばTextBoxコントロールのTextプロパティに、データテーブルの[日付]列の値をバインディングしたいときは、「New Binding("Text", Me.XML_BindingSource, "日付",True)」のようなコードで、先ほどデータ・バインディングしたBindingSourceコンポーネントを引数にしてAddメソッドを実行する。

 なぜ単一オブジェクトのプロパティではなくコレクション・プロパティかといえば、コントロールにバインディングする(=ひも付ける)のではなく、コントロールのプロパティに対してバインディングをするために、コントロールからみれば複数のバインディングを定義できるコレクションとなるわけだ。どのようなプロパティにバインディングができるのかといえば、[プロパティ]ウィンドウの[(DataBindings)]プロパティの「(詳細)」をクリックして[フォーマットと詳細バインド]ダイアログを表示すれば確認できる。

図7 [フォーマットと詳細バインド]ダイアログ

 CheckBoxコントロールでは、チェックボックスがチェックされているか/いないかを、Checkedプロパティで取得・設定する場合が多い。が、データセット(特にRDBMS)とデータ・バインディングするときには、(Checkedプロパティではなく)CheckStateプロパティの方が使いやすい。CheckStateプロパティは次のような値を取る。

CheckStateプロパティ値 意味
0 チェックしていない
1 チェックしている
2 「0」「1」以外
表1 CheckStateプロパティに指定できる値


 INDEX
  [連載]Windowsフォーム開発入門【Visual Studio 2010対応】
  Windowsフォームにおける「データ・バインディング」
    1.データ・バインディングで「複数行のデータを表示」
  2.データ・バインディングで「現在行のデータを表示」
    3.データ・バインディングで「選択候補としてデータを表示」

インデックス・ページヘ  「Windowsフォーム開発入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH