連載:実践で役立つ業務アプリ開発のヒント

第2回 ユーザー・インターフェイス開発は分割して小さくする

えムナウ(児玉宏之)
Microsoft MVP Visual Developer - Visual C# JAN 2005 − DEC 2007)
2007/07/06
Page1 Page2 Page3

開発ヒント6:BindingSourceコンポーネントは共通で使う

 私が以前書いた記事「.NET Framework 2.0のWindowsフォーム新機能(後編)」では、データソースからデータセット内の「顧客」テーブルのデータを詳細コントロールとして配置したが、このときデータバインディング(=データ連結)という(ADO.NETの)技術によってコントロールとデータセットを結び付けた。

 先ほど例として示した画面パーツ(Sample1SearchControlなどのユーザー・コントロール)でも、同じ技術が使われている。具体的には、検索/一覧/詳細部分で使われていたSample1ListControl(一覧画面パーツ)/Sample1DetailControl(詳細画面パーツ)/Sample1SearchControl(検索画面パーツ)などのコントロールは、ユーザーDataSet(データセット)とデータバインディングしている。

 そしてこのデータバインディングを行う際には、実際には(前掲の図には描かなかったが)「ユーザーBindingSource」というBindingSourceコンポーネント(=データバインディングを担当するオブジェクト)を仲介役として使用する。これにより、例えば一覧画面パーツで選択行が変更されたときに詳細画面パーツの表示内容が切り替わるように実装できる。次の図はその仕組み・関係をまとめたものだ。

BindingSourceコンポーネントを使う場合の各画面パーツとデータセットの関係図
各コントロール/各画面パーツがBindingSourceコンポーネントを経由してデータセットにデータバインディングする際の関係を図に表したもの。

 以下では、各コントロール/各画面パーツで同じBindingSourceコンポーネントを経由してデータセットにデータバインディングする方法を示す。

 まず、詳細画面パーツでBindingSourceコンポーネントを使うようにするには、以下のコードを詳細画面パーツに含まれるそれぞれのコントロールについて書いておく。

Me.IDBaseLabel.DataBindings.Clear()
Me.IDBaseLabel.DataBindings.Add( _
  New Binding("Text", Me.ユーザーBindingSource, "ID", True))
詳細画面パーツに含まれるコントロールとBindingSourceコンポーネントのデータバインディング(Labelコントロールの例)
このコードでは、まず既存のデータバインディングを全削除してから、LabelコントロールのTextプロパティと、BindingSourceコンポーネントであるユーザーBindingSourceをデータバインディングしている。このような処理をすべてのコントロールに対して行う必要がある。

 一方、画面フォームに表示しているナビゲータ(=レコードのカーソル位置を[先頭]や[末尾]、[前へ]や[次へ]と移動させたり、データの削除や更新の保存などができるツールバー。本稿の例では「ユーザーBindingNavigator」)でBindingSourceコンポーネントを使うためには、以下の1行だけでいい。

Me.ユーザーBindingNavigator.BindingSource = Me.ユーザーBindingSource
ナビゲータとBindingSourceコンポーネントのデータバインディング

 また、一覧画面パーツでも、以下の1行を記述すればよい。

Me.ユーザーBaseDataGridView.DataSource = Me.ユーザーBindingSource
一覧画面パーツとBindingSourceコンポーネントのデータバインディング

 一般的に、詳細画面パーツが最もコントロール数が多いので、詳細画面パーツのユーザーDataSetとユーザーTableAdapterやユーザーBindingSourceを、画面フォームと一覧画面パーツ(や検索画面パーツ)などに結び付け直す(つまり、詳細画面パーツのBindingSourceコンポーネントとデータセットを共有して使い回す)のが最も効率が良い。次のコードはそれを実装した例だ。

Private Sub Sample1Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  RebindBindingSource()
  Me.ユーザーTableAdapter.Fill(Me.ユーザーDataSet.ユーザー)
End Sub

Public Sub RebindBindingSource()
  ' 詳細画面パーツのユーザーDataSetやユーザーTableAdapterや
  ' ユーザーBindingSourceを画面フォームに結び付け直す
  Me.ユーザーDataSet = Me.Sample1DetailControl1.ユーザーDataSet
  Me.ユーザーTableAdapter = Me.Sample1DetailControl1.ユーザーTableAdapter
  Me.ユーザーBindingSource = Me.Sample1DetailControl1.ユーザーBindingSource
  ' 画面フォームのナビゲータに結び付け直す
  Me.ユーザーBindingNavigator.BindingSource = Me.ユーザーBindingSource
  ' 一覧画面パーツに結び付け直す
  Me.Sample1ListControl1.ユーザーDataSet = Me.ユーザーDataSet
  Me.Sample1ListControl1.ユーザーTableAdapter = Me.ユーザーTableAdapter
  Me.Sample1ListControl1.ユーザーBindingSource = Me.ユーザーBindingSource
  Me.Sample1ListControl1.ユーザーBaseDataGridView.DataSource = Me.ユーザーBindingSource
End Sub
画面フォーム/一覧画面パーツと(詳細画面パーツの)BindingSourceコンポーネントのデータバインディング

 このように、フォームがロードされるタイミングで、詳細画面パーツのユーザーDataSetやユーザーTableAdapterやユーザーBindingSourceを、画面フォームと一覧画面パーツに結びつけ直すと、画面フォームだけでBindingSourceコンポーネントとのデータバインディングがすべて完了する。

 さて、ここまで読んでいただいて、どんな感想を持たれたであろうか? たった1つの画面をこんなに分離したら非効率だと感じた方もいると思う。確かに1画面だけしかないのであればかえって非効率である。だが同じような機能を持つ画面が複数ある場合、都道府県を選択させるコンボボックスや検索/一覧/詳細の各画面パーツなどをユーザー・コントロールとして作成しておくと、実際の作業は画面パーツを組み合わせるだけになり、再利用性が高まり柔軟に対応できるので開発を効率化できる。次回は今回の内容を踏まえて三段継承やMVCパターンの導入などさらに効率化を高める手法について解説する。End of Article


 INDEX
  実践で役立つ業務アプリ開発のヒント
  第2回 ユーザー・インターフェイス開発は分割して小さくする
    1.開発ヒント4:ラッパー・コントロールの作成
    2.開発ヒント5:画面パーツのユーザー・コントロール化
  3.開発ヒント6:BindingSourceコンポーネントは共通で使う
 
インデックス・ページヘ  「実践で役立つ業務アプリ開発のヒント」


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