- - PR -
複数フォームで同じコードを書いてあるのですが。
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-08 12:11
Windowsアプリを作成中にこれでいいのかなと悩んでます。
Windowsフォームが複数あり、それぞれに同じコードがあります。 コードの内容は、フォームに置いたコンボボックスの値をセットするというもので。 ↓のようなのが複数(5つ)あります。 ------------------------ #region コンボボックスセット private void set_combobox() { combobox1.Items.Add("指定しない"); combobox1.Items.Add("内容1"); combobox1.Items.Add("内容2"); combobox1.DropDownStyle = ComboBoxStyle.DropDownList; combobox1.SelectedIndex = 0; } #endregion --------------------------------- いまは、このメソッド群を各フォームに設置してあるのですが、 修正があるたびにフォームの数だけ修正するのは、やはり どこか設計が間違ってると思えてきました。 ただ、複数のフォームを統一できない仕様でして。 いろいろと考えていくうちに混乱してきました。 自分なりに結論として出したのは、 //------------------------------------------------------ 現在privateになっているのをprotedtedに変更。 フォームAに、コンボボックスの値をセットするメソッドを書いて利用。 他のフォームでは、フォームAのインスタンスを生成してメソッドを利用。 //------------------------------------------------------ という方法なのですが、みなさんのご意見を伺いたく投稿しました。 よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2007-06-08 12:20
一番簡単なやつ。
こういうのを作って、フォームでは
などとして利用する。 まずはオブジェクト指向あたりについて基礎から勉強されるのが 一番だと思います。 (そうじゃないと今回のような結論を出してしまいがち) _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||
|
投稿日時: 2007-06-08 12:52
こちらについて詳しく解説して頂かないと回答に困ると思います。ぽぴ王子さんのようにメソッド化するという方法ならば、Items または DataSource に割り当てられることになる配列 (コレクション) を返すメソッドを作成するという方法もあります。 あとはそれを、
だとか、
とかすれば良いわけです。 私の場合はマスタ テーブルから取得するパターンが多いので、型付 DataSet (DataTable) をそのまま利用するコトが多いです。型付 DataSet 群はクラス ライブラリに入れてしまい他のプロジェクトから参照しています。 ちなみに、
こういったものは汎用性がなくなるので外に切り出さないようにしています。 データだけを取得するものを別途作る理由もそこです。データを組み立てるメソッド自身は自分が戻り値として返したものを、何に (どの型に (ComboBox.Items に)) 利用するのかは知る必要はないですし、知らないような実装が望ましいです。 そうすれば、ComboBox 以外でも使えます。逆に言えば ComboBox にしか使えないのは... まあ今回は値が固定値なので、ここまで書いてしまうとあまりに酷だと思いますが、固定値を使わない方が良いですという意味も含めて書かせて頂きました。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-06-08 12:53
> ただ、複数のフォームを統一できない仕様でして。
まあ、これはよくあることですので、下手にまとめるようなことはしないほうがいいですね。 > 現在privateになっているのをprotedtedに変更。 > フォームAに、コンボボックスの値をセットするメソッドを書いて利用。 > 他のフォームでは、フォームAのインスタンスを生成してメソッドを利用。 これは絶対やめたほうがいいですね。共通のメソッドを使用するためにフォームのインスタンスを作成するのはあまりにも無駄が多いし、それに他のフォームがフォームAに依存してしまいます。ってか上の例だと protedted なので結局メソッドを外から呼べないし^^; コンボボックスはフォームに依存しなければいけないと思っているように思えますが、そんなことはありません。別途クラスを用意してそこに記述するほうがいいと思います。 プログラムの設計としては MVC あたりを参考にするといいかもしれませんね。 | ||||||||||||||||
|
投稿日時: 2007-06-08 13:01
protected と書いてあるところからして、 "他のフォームでは、フォーム A のインスタンスを生成してメソッドを利用" ではなく、 "他のフォームは、フォーム A を継承してそのメソッドを利用" と仰りたかったのではないかと思っておりました。 メソッドに切り出すという意味であれば、Form ではなくただの Class に書けば良いお話ですし、仮に Form であってもインスタンスを生成するよりか static メソッドに書いた方がまだマシですね。 とりあえず、こんな Form とは関係のない実装で継承するのは止めた方が良いですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-06-08 13:10
さっそくのご返答ありがとうございます。
ぽぴ王子さんの方法は思いつきもしませんでした。 すごくわかりやすいです。 >>ただ、複数のフォームを統一できない仕様でして。 >>>>こちらについて詳しく解説して頂かないと回答に困ると思います。 説明不足で、すいません。 今回の決まりごとで、データの新規登録、更新、閲覧をそれぞれ 別フォームにしなければいないということになってまして。 どの画面でも同じコンボボックスを利用しているので、 なんとか修正箇所を減らす方法はないかと考えておりました。 >>コンボボックスはフォームに依存しなければいけないと思っているように思えますが、 >>そんなことはありません。別途クラスを用意してそこに記述するほうがいいと思います。 仰るとおりテキストボックスをはじめフォームに貼り付けるコントロールは 各フォームで処理するものとばかり思っていました。 貴重なご意見ありがとうございました。 | ||||||||||||||||
|
投稿日時: 2007-06-08 21:50
そういうデータで初期化する、ComboBox を継承したコントロールを作る。
こんな感じで OK かと。
_________________ | ||||||||||||||||
|
投稿日時: 2007-06-08 23:45
NAL-6295です。
これをやっちゃうとデータの種類分だけ作成する必要があって、現実的な解では無いのでは? _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ |