- ベストアンサー
Loadイベント中にほかのイベントを発生したくない
- VisualC# .netのフォーム表示時、コンストラクタの後にロードイベントでフォームの初期設定を行っています。しかし、このロードイベント内でコンボボックスの初期設定を行うと、コンボボックスのイベントが発生してしまいます。フラグを立てるかDebugger.IsAttachedを使用することで回避できます。
- VisualC# .netのフォーム表示時、コンストラクタの後にロードイベントでフォームの初期設定を行っています。その際、コンボボックスの初期設定を行うとコンボボックスのイベントが発生してしまいます。この問題を解決するためには、フラグを立てるかDebugger.IsAttachedを使用する方法があります。
- VisualC# .netのフォーム表示時、コンストラクタの後にロードイベントでフォームの初期設定を行っています。しかし、ロードイベント内でコンボボックスの初期設定を行うとコンボボックスのイベントが発生してしまいます。この問題を回避するためには、フラグを立てるかDebugger.IsAttachedを使用する方法があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SelectedItemChanged()で他にも処理をするようですし、フラグでいいんではないでしょうか。 Loadが終わったかどうかを判断するプロパティは無いと思います。 どうしてもプロパティやメソッドとして制御したいようなら、フォームにスーパークラスを作るとか、 アクセサにすればいいのでは。 個人的にはフラグはあまり使いたくありませんが。
その他の回答 (1)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
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("変更しました"); }
お礼
ありがとうございます。 やはり存在しないみたいですね とりあえず私も調べてそれらしいのをみつけました。 DesignModeっていうのがあるみたいですけど使えないみたいですね。 私もフラグは好きじゃないので質問をさせてもらったのですけど とりあえず今回はフラグを使用して対応しておきます。 スーパークラスは作れないです。作り方わからないです。 たぶん、サブクラス作って、内部でフラグを使用するぐらいしか思いつかないです。