C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ボタンを継承したときにクリックイベントが2度呼ばれる


(過去ログ 122 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■72996 / inTopicNo.1)  ボタンを継承したときにクリックイベントが2度呼ばれる
  
□投稿者/ けん (5回)-(2014/08/08(Fri) 14:33:49)

分類:[C#] 

ダブルクリックを認識するボタンを自分で作成しました。

そのさいにカスタムボタン側にて

this.SetStyle(ControlStyles.StandardClick, true);
this.SetStyle(ControlStyles.StandardDoubleClick, true);

を行い
フォーム側にてイベントを下記のように設定しました。

this.dblButton1.DoubleClick += new System.EventHandler(this.dblButton1_DoubleClick);
this.dblButton1.Click += new System.EventHandler(this.dblButton1_Click);

思惑道理ダブルクリックも認識するようになったのですが
シングルクリック時にクリックイベントが2度発生してしまいます。
※カウンター設置してみて判明

クリック時はクリック1回のみイベントが発生するようにしたいのですが
どうすればよいでしょうか?

<追記>
this.SetStyle(ControlStyles.StandardDoubleClick, true);をONにすると2度発生してしまうようです。

引用返信 編集キー/
■72997 / inTopicNo.2)  Re[1]: ボタンを継承したときにクリックイベントが2度呼ばれる
□投稿者/ tinq (13回)-(2014/08/08(Fri) 14:55:54)
No72996 (けん さん) に返信
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.controlstyles(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.click(v=vs.110).aspx
などによると
>標準の Windows フォーム コントロールから継承し、StandardClick ビット値または StandardDoubleClick ビット値を true に変更すると、コントロールが Click イベントまたは DoubleClick イベントをサポートしていない場合は、予測できない動作が行われたり、何の効果も得られなかったりします。
とあるので、それではないでしょうか。


http://msdn.microsoft.com/ja-jp/library/ms172533(v=vs.90).aspx
にそれっぽい内容がありますが、自分で判定するしかないかもしれません。

引用返信 編集キー/
■72998 / inTopicNo.3)  Re[2]: ボタンを継承したときにクリックイベントが2度呼ばれる
□投稿者/ ぽぴ王子 (7回)-(2014/08/08(Fri) 15:16:52)
ぽぴ王子 さんの Web サイト
No72997 (tinq さん) に返信
> ■No72996 (けん さん) に返信
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.controlstyles(v=vs.110).aspx
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.click(v=vs.110).aspx
> などによると
> >標準の Windows フォーム コントロールから継承し、StandardClick ビット値または StandardDoubleClick ビット値を true に変更すると、コントロールが Click イベントまたは DoubleClick イベントをサポートしていない場合は、予測できない動作が行われたり、何の効果も得られなかったりします。
> とあるので、それではないでしょうか。

自分はちょうどここを見ていました。

http://msdn.microsoft.com/ja-jp/library/ms171543%28v=vs.110%29.aspx

> 1 つの解決方法は、ダブルクリック イベントを処理し、クリック イベントの処理でアクションをロールバックすることです。

と書いてあるのですが、実際のところ MessageBox を表示しているだけで、それをロールバックと呼んでいる
ようです。あまり役に立たないというか、期待外れというか。

> http://msdn.microsoft.com/ja-jp/library/ms172533(v=vs.90).aspx
> にそれっぽい内容がありますが、自分で判定するしかないかもしれません。

で、私も tinq さんと同意見で、やはり自分で判定するしかないのかもしれない、と思いました。
とりあえず抜粋ですが、こんな感じでやってみました。
Click イベントの前に MouseDown イベントが発生することを利用して、フラグを設定することで
一度目の Click イベントを無効にしています。

    public partial class Form1 : Form
    {
        private bool firstClick = false;

        private void dblButton1_DoubleClick(object sender, EventArgs e)
        {
            Console.WriteLine("DoubleClick!");
        }

        private void dblButton1_Click(object sender, EventArgs e)
        {
            if (firstClick == false)
            {
                Console.WriteLine("Click!");
            }
            firstClick = false;
        }

        private void dblButton1_MouseDown(object sender, MouseEventArgs e)
        {
            firstClick = true;
        }
    }

参考になるかどうかわかりませんが、試していただければと思います。

引用返信 編集キー/
■73003 / inTopicNo.4)  Re[3]: ボタンを継承したときにクリックイベントが2度呼ばれる
□投稿者/ kenn (1回)-(2014/08/09(Sat) 13:26:44)
2014/08/09(Sat) 13:31:16 編集(投稿者)
2014/08/09(Sat) 13:30:43 編集(投稿者)
2014/08/09(Sat) 13:30:39 編集(投稿者)

投稿者のけんです。

ぽぴ王子さん、tinq さん

返信有難うございます!
ご教授いただいた内容でやってみます!

それにしてもこういう仕様なんですね〜・・・。
なにやらバグっぽいですよね。

動作が不定になるなど今後ちゃんと対応して欲しいですよね。
ダブルクリックボタンなど必要な場合もありますし。

ありがとうございました。
また何か有りましたらどうぞよろしくお願いしますm(__)m
解決済み
引用返信 編集キー/
■73004 / inTopicNo.5)  Re[4]: ボタンを継承したときにクリックイベントが2度呼ばれる
□投稿者/ 渋木宏明 (42回)-(2014/08/09(Sat) 14:11:14)
渋木宏明 さんの Web サイト
> それにしてもこういう仕様なんですね〜・・・。
> なにやらバグっぽいですよね。

Win32 の仕様です。

マウスボタンがクリックされたとして、それが「シングルクリックなのか」はたまた「ダブルクリックの1回目なのか」を区別することは、マウスボタンを押した本人以外、誰にもできません。

システム的に判定するとしたら

・マウスボタンが押された時点で即座にシングルクリックのイベント通知は行わない
・その状態で一定時間経過したらシングルクリックのイベントを通知
・時間経過前にマウスボタンがクリックされたらダブルクリックのイベントを通知

となりますが、そうするとシングルクリックのイベント通知がどうしてもワンテンポ遅れてしまいます。

その遅れを許容するかどうかはシステムがお仕着せで決めるのではなく、「アプリケーション設計者が判断するべきである」と Win32 仕様決定者は判断したのだと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -