- PR -

複数フォームで同じコードを書いてあるのですが。

投稿者投稿内容
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 2007-06-15 16:49
結果報告の書き込みをしようと思って書き込み数の多さに驚きました。
みなさんの貴重な議論の内容をじっくり読んで今後の参考にしたいと思います。

ここに書き込みしてからいろいろと試行錯誤した結果です。
少し長くなってしまったのでDB接続の部分とDataView作成部分は省略しました。
各namespace毎に別ファイルにしています。
----------------------------------------------------------------

namespace share
{
#region ***** コンボボックス *****
class setcmb
{
public void set(cmbBox c, ComboBox cmb)
{
c.getdat();
c.set(cmb);
}
}

abstract class cmbBox
{
protected System.Data.DataView dataView = null;
public cmbBox()
{
dataView = new System.Data.DataView();
}

public abstract void getdat();

public void set(ComboBox cmb)
{
cmb.DataSource = dataView;
cmb.DisplayMember = "field02";
cmb.ValueMember = "field01";
}
}
#endregion
}

//マスタの一つ(マスタの個数分だけこのようなクラスを作りました)
namespace mst
{
#region ***** 予約区分 *****
class yoyakukbn : share.cmbBox
{
public override void getdat()
{
string sqltxt = "SELECT * FROM yoyaku_kbn ORDER BY field01";
share.cs_db db = new share.cs_db();
db.set_dView(sqltxt);
this.dataView = db.dView;
}
}
#endregion
}

//実際に使っている部分
//各フォーム(新規、更新、閲覧)に同じように書きました。
//3種類あるのは、フォームにTabControlを配置してまして
//TabPageが3ページ(固定)の中にコンボボックスを配置しています。
private void frm_Load(object sender,EventArgs e) {
share.setcmb cmb = new share.setcmb();
cmb.set(new mst.yoyakukbn(), comboBox25_1);
cmb.set(new mst.kaiinkbn(), comboBox11_1);
cmb.set(new mst.shohinkbn(), comboBox30_1);
cmb.set(new mst.denpyokbn(), comboBox30b_1);
cmb.set(new mst.syukkakbn(), comboBox44_1);
cmb.set(new mst.uketukekbn(), comboBox21_1);
cmb.set(new mst.ukeirekbn(), comboBox20_1);

cmb.set(new mst.yoyakukbn(), comboBox25_2);
cmb.set(new mst.kaiinkbn(), comboBox11_2);
cmb.set(new mst.shohinkbn(), comboBox30_2);
cmb.set(new mst.denpyokbn(), comboBox30b_2);
cmb.set(new mst.syukkakbn(), comboBox44_2);
cmb.set(new mst.uketukekbn(), comboBox21_2);
cmb.set(new mst.ukeirekbn(), comboBox20_2);

cmb.set(new mst.yoyakukbn(), comboBox25_3);
cmb.set(new mst.kaiinkbn(), comboBox11_3);
cmb.set(new mst.shohinkbn(), comboBox30_3);
cmb.set(new mst.denpyokbn(), comboBox30b_3);
cmb.set(new mst.syukkakbn(), comboBox44_3);
cmb.set(new mst.uketukekbn(), comboBox21_3);
cmb.set(new mst.ukeirekbn(), comboBox20_3);
}



[ メッセージ編集済み 編集者: バニラミント 編集日時 2007-06-15 16:55 ]

[ メッセージ編集済み 編集者: バニラミント 編集日時 2007-06-15 16:58 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-06-15 21:12
引用:

れいさんの書き込み (2007-06-14 10:02) より:
最終的には「結局ケースbyケースです」って結論で終わるのは
論理的に間違ってないとは思うのですが、それでは議論がもったいないですし、
質問者の為にも(むしろ私のために)よくない。


 私ももったいないと思いますが、もったいないと思わない人が「脱線させすぎ」と声を上げるので、やめようとしてみたんですけどね:p


 昔のプロジェクトで、「メンバーマスタ」を作りました。このプロジェクトでは、「マスターメンテナンス」「障害情報管理」「テスト実施管理」の機能があります。
障害情報管理だけに限っても、簡易検索画面、詳細検索画面、初期登録画面、割り当て画面、修正入力画面、承認画面(1画面だけど、シチュエーションを画面と表現)で、メンバーマスタを使います。
 そのため、まずデータを固めました。DB のテーブルと同じ定義を持つ DataRow, DataTable を定義しました(というか、DataSet デザイナが作ってくれました)。
 次に、DbCommand を継承して、このテーブルを返すクラスを作りました。
 そして、この DbCommand によって選択肢を初期化するメソッドを持った、DropDownList を継承したクラスを作りました。当然、SelectedItem も、メンバーDataRow を返します。

 このおかげで、各画面にはポトペタで、必ずメンバーを返すドロップダウンリストを貼り付けることができました。本当に、貼り付けるだけでね。
 当然、「プロジェクト参加者だけで良いんだけど?」「一般社員は承認しちゃいけないでしょ?」という要望はありましたが、デフォルトでは「すべてのメンバーを返す」ようにして、プロパティの追加で対応しました。
 後に「プロジェクト管理」「レビュー管理」が追加になりましたが、その時もポトペタです。後からの追加に対しては、大いに生産性向上に寄与しました。
 たとえば、「誰かさんに催促メールを出す」画面を追加する場合、データーベースへの接続も考えることなく、誰かさんの一覧を表示することができ、メンバーDataRow からメールアドレスを取得することができます。

 私は、このコントロールを使った場面それぞれで、独自にデータを持ってきて、フィルタして、バインドして、キャストする...という処理を書く方が、ぞっとします。しかもそれらの処理は、コントロールのコンテナに、散らばって書かれます。
 ただし、副作用として、他のプロジェクトでは使えません。そうはいっても、一連のプロジェクトでは、特化の恩恵を十分に受けられたと思います。

 なお、ちっと特殊な「メンバー」と「プロジェクト」は独自に実装しましたが、その他の汎化できるマスタについては、どのマスタかを選ぶプロパティを付けてひとつのコントロールとしました。こちらは、「マスタDataTable」その他を作って、SelectedValue では マスタDataRow を返します。
どこまで特化するかについては、十分な見極めが必要です。
(そして、ビューが使えることに、最近気がついたorz)


 最初の投稿でデータの初期化もひっくるめて「コントロール化しちゃえば?」と書きましたが、このように、データはコントロールの外から持ってくることを考えていました。
この点は、ごめんなさい。
_________________

スキルアップ/キャリアアップ(JOB@IT)