http://blogs.wankuma.com/rti/archive/2007/06/12/80453.aspx
部品化する場合としない場合
の続きです。
そもそも、じゃんぬねっとさんのコメントに対するコメントとして書いたのですが、折角なのでネタとして僕の考えをまとめておきます。
さて、このタイトルも前回のタイトルもそうですが、テーマとしては次のようなものです。
あるデータがあります。
そのデータに特化したコントロールを作る場合と作らない場合があります。
これは、
ケースバイケース
に他なりません。
これが、最初から言っている僕の意見です。
誤解のないように言っておきますが、コントロール内部でデータ本体を持つことは反対です。
これは一度もやったことがありません。
基本的には、データを格納するクラス(型付きデータセットとか、List<> とか)を作って、そこに放り込んでバインドします。
この方法は常に変わりません。
データソースはデータベースであったり、そのクラス自身に持たせたりします。
さて本題です。
では、素敵だし爽やかRさんは、馬鹿のひとつ覚えのようにケースバイエースと言っています。
では、どういう場面においてデータに特化したコントロールを作るのでしょうか?
まずは、前回ちょっと触れた都道府県データに関する例を考えてみます。
都道府県・市区町村を選択する局面において、まずは DataTable オブジェクトに都道府県データを突っ込みます。
これだけなら別段、都道府県に特化したコンボボックスを作ろうとは思いません。
では、都道府県を選択するコンボボックスが大量に必要になった場合はどうでしょうか?
方法は3つ考えられます。
どの方法を使いますか?
- 標準コンボを毎回バインドする処理、あるいはプロパティを設定する
- データソースウィンドウからテーブルのフィールドのコントロールをコンボボックスに指定してフォームに貼り付ける
- コンボボックスを拡張してバインドの処理を含めてしまう
- その他
僕は、3つめを選択します。
次に、市区町村を選択する必要も出てきたとします。
都道府県を変更することで、市区町村の選択肢は、その都道府県に準じたものになります。
このやり方は、市区町村TableAdapter に FillBy都道府県(string prefectureValue) なりを追加して実行したデータを市区町村コンボにバインドします。
しかし、このような処理が複数のフォームで必要になった時、これらはユーザーコントロールにしても良いと思います。
あるいは、商品マスターの商品コードを入力するケースです。
商品マスターを入力するテキストボックスをシステム全体から見た時に、大量に使うことになります。
これは、以下の要件を備えたものになります。
・テキストボックスは、ANKの16バイトの入力制限付き、更に商品マスターの存在チェックまでしなくてはならない。
・入力された文字列は、有効なら黒色、無効なら赤色表示。
・無効状態なら、他の入力ボックスのフォーカスに移動できない。
(つい先日、似たようなものを作ったばかりです)
どの方法を使いますか?
- 毎回プロパティに設定、イベントも記述。
- 入力規則の下請けメソッドを作って共通で呼びまわす。
- 品番入力ボックスをテキストボックスから拡張。
- その他。
僕はやっぱり品番入力ボックスを作りますね。
ちなみに、品番入力ボックスの右に「参照」ボタンを付けて、品番検索ダイアログボックスが開くように機能追加した時に、とっても楽でした。
上記のケースは、何れも、あるデータに特化した専用のコントロールになります。
名前も、都道府県選択ボックス・市区町村選択ボックス・品番入力ボックスというコントロールです。
そして、これらのコントロールは、生産性も品質も向上させるものになると思います。
こういうケースはあって良いと思うので「データごとにコントロールを作るべきではない」という意見に、ケースバイケースでしょうと言っただけの話です。
上記のような、コントロールの存在を許したら、存在するデータの数だけコントロールを作らなくてはいけない訳ではありませんよね。
基本的に、既存のコントロールにバインドしてあげる。
データに特化したコントロールは必要に応じて作る。
ケースバイケースです。