- ベストアンサー
クリックイベントの発生順序に起因する問題を回避する方法
- Visual Studio 2008 C#での開発で、button1のクリックイベントの途中で意図しないradioButton1のクリックイベントが発生してしまう問題が発生しています。
- button1がクリックされた場合、button1自身を使用不可にするため、button1.Enabledをfalseに設定します。
- しかし、button1のクリックイベントの途中でradioButton1がクリックされると、button1のEnabledがtrueに戻ってしまい、思ったような動作になりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 button1とradioButton1へのクリックイベントの登録は解除しておいてください。 button1とradioButton1をサブクラス化して、自前でクリックイベントを呼び出します。 これで回避出来る筈です。以下参考程度に。 namespace WindowsFormsApplication { public partial class Form1 : Form { public Form1() { InitializeComponent(); CtlHook hookBtn = new CtlHook(button1, button1_Click); CtlHook hookRadio = new CtlHook(radioButton1, radioButton1_Click); } public void button1_Click(object sender, EventArgs e) { Console.WriteLine("1:button1がクリックされました"); Console.WriteLine("2:button1のenabled=" + button1.Enabled); button1.Enabled = false; Console.WriteLine("6:button1のenabled=" + button1.Enabled); } public void radioButton1_Click(object sender, EventArgs e) { Console.WriteLine("3:radioButton1がクリックされました"); Console.WriteLine("4:button1のenabled=" + button1.Enabled); button1.Enabled = true; Console.WriteLine("5:button1のenabled=" + button1.Enabled); } public class CtlHook : NativeWindow { public delegate void ClickEvent(object sender, EventArgs e); private Control hwnd; private ClickEvent cEvent; public CtlHook(Control target, ClickEvent c) { target.HandleCreated += OnHandleCreated; target.HandleDestroyed += OnHandleDestroyed; hwnd = target; cEvent = c; } internal void OnHandleCreated(object sender, EventArgs e) { Control s = sender as Control; AssignHandle(s.Handle); } internal void OnHandleDestroyed(object sender, EventArgs e) { ReleaseHandle(); } protected override void WndProc(ref Message m) { switch (m.Msg) { case 0x0201://WM_LBUTTONDOWN { cEvent(hwnd, null); } break; } base.WndProc(ref m); } } } }
その他の回答 (1)
- magicalpass
- ベストアンサー率58% (378/648)
Form上でイベントが発生すると、選択状態のラジオボタンにClickイベントが発生するようです。 一般的にラジオボタンはClickイベントではなくCheckedChangedでイベント処理を行います。 こちらの方はラジオボタンの選択状態が変化した時に発生します。 「radioButton1の選択状態に関わらずクリックされたら処理する」というのでなければ、ClickイベントではなくCheckedChangedイベントでbutton1の有効/無効化を行うようにしてはどうでしょうか?
お礼
「Form上でイベントが発生すると、選択状態のラジオボタンにClickイベントが発生するようです。」 どうもそのようですね。 「一般的にラジオボタンはClickイベントではなくCheckedChangedでイベント処理を行います。」 その通りなんですが、Clickイベントで行いたい(チェックのついているradioButtonが再度クリックされてもbutto1を使用可に戻したい)とすると、 「button1のクリックイベントでradioButton1のクリックイベントが発生する」という状況は きわめてまずいのです。 そうすると、何かフラグを持ってきて、「今回のイベント発生はbutton1が押された時のものである」とか 「純粋にradioButton1のクリックによって発生したものである」という判断をするしかない ということになりそうですね。
お礼
回答、ありがとうございます。 現在はflagを立てて処理をしています。 一応、動いています。 「自前のクリックイベント」、なるほどですね。 勉強になります。 そこまでやらなくてはならないということは そもそもボタンのクリックイベントでラジオボタンのクリックイベントが 発生してしまうという仕様に問題があるのだということが 改めて実感できました。 コードはとても参考になります。本当にありがとうございました。 今後ともよろしくお願いします。