|
|
連載:実践で役立つ業務アプリ開発のヒント
第2回 ユーザー・インターフェイス開発は分割して小さくする
えムナウ(児玉宏之)
(Microsoft MVP Visual Developer - Visual C# JAN 2005 − DEC 2007)
2007/07/06 |
 |
|
●開発ヒント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パターンの導入などさらに効率化を高める手法について解説する。
業務アプリInsider 記事ランキング
本日
月間