gooドクター有料プランが1ヶ月間無料!

VisualC# .net です。
フォームを表示する場合に
コンストラクタが呼ばれその後ロードイベントで
フォームのコントロールの初期設定を行っています。
(この方法がまちがっている?)
ロードイベント内でコンボボックスの初期設定を行うと
コンボボックスのイベントが発生してしまいます。
以下参照にて
このイベントでメッセージを表示しているのですが
初期設定では出てほしくありません。

そこで、
これを防ぐためには以下のようにフラグを立てるような
方法しかないのでしょうか?
それともDebugger.IsAttached のようなものが
用意されているのでしょうか

public bool iload = false;     (←仮フラグを追加)

private void Form1_Load(object sender, EventArgs e)
{
iload = true;    (←仮フラグを登録)
ComboBox1.SeletedIndex = 0;
iload = false;   (←仮フラグを削除)
}


private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (iload) return;     (←仮フラグ登録時はなにもしない)
MessageBox.Show("変更しました");
}

gooドクター

A 回答 (2件)

SelectedItemChanged()で他にも処理をするようですし、フラグでいいんではないでしょうか。


Loadが終わったかどうかを判断するプロパティは無いと思います。

どうしてもプロパティやメソッドとして制御したいようなら、フォームにスーパークラスを作るとか、
アクセサにすればいいのでは。

個人的にはフラグはあまり使いたくありませんが。
    • good
    • 0
この回答へのお礼

ありがとうございます。

やはり存在しないみたいですね
とりあえず私も調べてそれらしいのをみつけました。
DesignModeっていうのがあるみたいですけど使えないみたいですね。

私もフラグは好きじゃないので質問をさせてもらったのですけど
とりあえず今回はフラグを使用して対応しておきます。

スーパークラスは作れないです。作り方わからないです。
たぶん、サブクラス作って、内部でフラグを使用するぐらいしか思いつかないです。

お礼日時:2014/11/05 09:50

Load中は、イベントを削除すればいいでしょう。



private void Form1_Load(object sender, EventArgs e)
{
 // イベントハンドラの削除
 comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged;

// 色々な処理

 // イベントハンドラの追加
 comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
}


もしくは、デザイナ上でイベントハンドラを紐づけておかず(プログラムのみ記述しておく)、
イベントが完了後にイベントハンドラを追加すればいいです。

コンストラクタで当然InitializeComponent()が呼ばれるわけですが、
その中でイベントハンドラが設定されるのが問題でしょう。


どうしてもイベントハンドラ周りの制御をいじりたくないというのならば、
質問に記されているような制御を行うことになるでしょう。

また、どのような制御を行っているのかわかりませんが、初期化時にイベントが走行しても
なんら影響のでないコードになっていれば、問題ないと思います。
逆に言うと、初期化によって選択されている値が変更されたにも関わらず、そのタイミング
で処理すべき処理が行われないとすると、そちらの方が影響を及ぼしたりはしないでしょうか?

この回答への補足

<<元々>>
private void Form1_Load(object sender, EventArgs e)
{
 ComboBox1.SeletedIndex = 0;
}

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
 Function(ComboBox1.Text);
 MessageBox.Show("変更しました");
}

処理的には問題なく動作します。
ただ、同じ処理が数か所存在しているので
起動前にメッセージ文をユーザーがクリックして
何度もメッセージ消去するのはおかしいですよね。

ロード後にイベントを定義するという方法ですが、
これだと初期設定(ロード)時の処理が反映されなくなるのではないでしょうか?


<<変更後:現実>>
public bool iload = false;

private void Form1_Load(object sender, EventArgs e)
{
 iload = true;
 ComboBox1.SeletedIndex = 0;
 iload = false;
}

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
 Function(ComboBox1.Text);
 if(iload == false) MessageBox.Show("変更しました");
}

<<変更後:理想(Debugger.IsAttachedのようなEvent.Executeがあれば>>
private void Form1_Load(object sender, EventArgs e)
{
 ComboBox1.SeletedIndex = 0;
}

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
 Function(ComboBox1.Text);
 if(!Event.Execute) MessageBox.Show("変更しました");
}

補足日時:2014/11/04 15:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング