- PR -

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

投稿者投稿内容
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 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のインスタンスを生成してメソッドを利用。
//------------------------------------------------------
という方法なのですが、みなさんのご意見を伺いたく投稿しました。
よろしくお願いします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-06-08 12:20
一番簡単なやつ。

コード:

public class util
{
    public static void setCombobox(ComboBox combo)
    {
        combo.Items.Clear();
        combo.Items.Add("指定しない");
        combo.Items.Add("内容1");
        combo.Items.Add("内容2");
        combo.DropDownStyle = ComboBoxStyle.DropDownList;
        combo.SelectedIndex = 0;
    }
}


こういうのを作って、フォームでは

コード:

    util.setCombobox(combobox1);


などとして利用する。

まずはオブジェクト指向あたりについて基礎から勉強されるのが
一番だと思います。
(そうじゃないと今回のような結論を出してしまいがち)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-08 12:52
引用:

バニラミントさんの書き込み (2007-06-08 12:11) より:

ただ、複数のフォームを統一できない仕様でして。


こちらについて詳しく解説して頂かないと回答に困ると思います。ぽぴ王子さんのようにメソッド化するという方法ならば、Items または DataSource に割り当てられることになる配列 (コレクション) を返すメソッドを作成するという方法もあります。

あとはそれを、

コード:

    this.comboBox1.Items.AddRange(GetPrincePopiItems());


だとか、

コード:

    this.comboBox1.DataSource = GetPrincePopiItems();


とかすれば良いわけです。

私の場合はマスタ テーブルから取得するパターンが多いので、型付 DataSet (DataTable) をそのまま利用するコトが多いです。型付 DataSet 群はクラス ライブラリに入れてしまい他のプロジェクトから参照しています。

ちなみに、

引用:

combo.DropDownStyle = ComboBoxStyle.DropDownList;
combo.SelectedIndex = 0;


こういったものは汎用性がなくなるので外に切り出さないようにしています。

データだけを取得するものを別途作る理由もそこです。データを組み立てるメソッド自身は自分が戻り値として返したものを、何に (どの型に (ComboBox.Items に)) 利用するのかは知る必要はないですし、知らないような実装が望ましいです。

そうすれば、ComboBox 以外でも使えます。逆に言えば ComboBox にしか使えないのは... まあ今回は値が固定値なので、ここまで書いてしまうとあまりに酷だと思いますが、固定値を使わない方が良いですという意味も含めて書かせて頂きました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オノデラ
会議室デビュー日: 2007/06/05
投稿数: 10
投稿日時: 2007-06-08 12:53
> ただ、複数のフォームを統一できない仕様でして。

まあ、これはよくあることですので、下手にまとめるようなことはしないほうがいいですね。


> 現在privateになっているのをprotedtedに変更。
> フォームAに、コンボボックスの値をセットするメソッドを書いて利用。
> 他のフォームでは、フォームAのインスタンスを生成してメソッドを利用。

 これは絶対やめたほうがいいですね。共通のメソッドを使用するためにフォームのインスタンスを作成するのはあまりにも無駄が多いし、それに他のフォームがフォームAに依存してしまいます。ってか上の例だと protedted なので結局メソッドを外から呼べないし^^;

 コンボボックスはフォームに依存しなければいけないと思っているように思えますが、そんなことはありません。別途クラスを用意してそこに記述するほうがいいと思います。
 プログラムの設計としては MVC あたりを参考にするといいかもしれませんね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-08 13:01
引用:

オノデラさんの書き込み (2007-06-08 12:53) より:

ってか上の例だと protedted なので結局メソッドを外から呼べないし^^;


protected と書いてあるところからして、

"他のフォームでは、フォーム A のインスタンスを生成してメソッドを利用"

ではなく、

"他のフォームは、フォーム A を継承してそのメソッドを利用"

と仰りたかったのではないかと思っておりました。

メソッドに切り出すという意味であれば、Form ではなくただの Class に書けば良いお話ですし、仮に Form であってもインスタンスを生成するよりか static メソッドに書いた方がまだマシですね。

とりあえず、こんな Form とは関係のない実装で継承するのは止めた方が良いですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 2007-06-08 13:10
さっそくのご返答ありがとうございます。
ぽぴ王子さんの方法は思いつきもしませんでした。
すごくわかりやすいです。

>>ただ、複数のフォームを統一できない仕様でして。
>>>>こちらについて詳しく解説して頂かないと回答に困ると思います。

説明不足で、すいません。
今回の決まりごとで、データの新規登録、更新、閲覧をそれぞれ
別フォームにしなければいないということになってまして。
どの画面でも同じコンボボックスを利用しているので、
なんとか修正箇所を減らす方法はないかと考えておりました。

>>コンボボックスはフォームに依存しなければいけないと思っているように思えますが、
>>そんなことはありません。別途クラスを用意してそこに記述するほうがいいと思います。
仰るとおりテキストボックスをはじめフォームに貼り付けるコントロールは
各フォームで処理するものとばかり思っていました。

貴重なご意見ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-06-08 21:50
 そういうデータで初期化する、ComboBox を継承したコントロールを作る。
こんな感じで OK かと。
コード:
public class MyComboBox : ComboBox
{
    public MyComboBox() : base() {
        this.Items.Add("指定しない");
        this.Items.Add("内容1");
        this.Items.Add("内容2");
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.SelectedIndex = 0;
    }
}


_________________
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-06-08 23:45
NAL-6295です。

引用:

Jittaさんの書き込み (2007-06-08 21:50) より:
 そういうデータで初期化する、ComboBox を継承したコントロールを作る。
こんな感じで OK かと。
コード:
public class MyComboBox : ComboBox
{
    public MyComboBox() : base() {
        this.Items.Add("指定しない");
        this.Items.Add("内容1");
        this.Items.Add("内容2");
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.SelectedIndex = 0;
    }
}






これをやっちゃうとデータの種類分だけ作成する必要があって、現実的な解では無いのでは?


_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/

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