none
GroupBoxにMouseDownなどのイベントがありませんが RRS feed

  • 質問

  • VS2008です。
    GroupBoxはプロパティウインドウにMouseDownなどの
    イベントがありませんが、そういうものなのでしょうか?
    VB6.0ではあったのですが。
    無いとしたら、何かやりようがありますか?
    2010年12月17日 2:35

回答

  • プロパティウィンドウには表示されていませんが、コードでイベントハンドラを設定できます。

    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
    
        groupBox1.MouseDown += new MouseEventHandler(groupBox1_MouseDown);
      }
    
      void groupBox1_MouseDown(object sender, MouseEventArgs e)
      {
        MessageBox.Show("MouseDown");
      }
    }
    

    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答の候補に設定 Pinokio-k 2010年12月17日 4:40
    • 回答としてマーク クサキ 2010年12月17日 7:48
    2010年12月17日 2:57
  • 調べてみましたが使ってほしくないようです。GroupBox.MouseDownイベント より

    この API は、.NET Framework インフラストラクチャをサポートします。独自に作成したコードから直接使用するためのものではありません。

    [BrowsableAttribute(false)]
    public event MouseEventHandler MouseDown

    • 回答としてマーク クサキ 2010年12月21日 0:26
    2010年12月17日 8:09
  • わざわざ
    [Browsable(false)]
    public new event EventHandler ~
    のように new してまで隠しているのですね。

    使ってほしくない理由がどこかに書かれてないかなと思って検索してみると、次のスレッド(英語)で質問されている人がいました。

    Why does GroupBox not have a MouseMove event?
    http://stackoverflow.com/questions/1710795/why-does-groupbox-not-have-a-mousemove-event

    難しくて理解できなかったのですが、理由は何かあるみたいですね。(^^;
    (Windows の仕様にかかわるみたいです。)

    リンク先に書かれている通り、FlatStyle の値を既定の "Standard" から "System" に変更してみると確かにイベントは発生しなくなりますね。
    使わないで済むような仕様に変更できれば、使わない方が良いかもしれませんね。

    MouseHover がそのまま表示されるのは漏れですかね。

    追記:本当は隠されているだけなので使っても問題ないと言いたくて調べたんですが、結論が逆になっちゃいました。(^^;

    • 編集済み TH01 2010年12月17日 9:15 追記
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月17日 8:59
  • > 一般的に、プロパティウインドに無かったら、使って欲しくないということですか?

    LostFocus イベントの説明には、佐祐理さんが引用されたような文言は書かれてないです。
    なので使ってもいいと思います!

    表示しないようになっているのにはそれぞれに理由があるはずで、LostFocus についてはたぶん、LostFocus イベントの「メモ」に書かれていることだと思います。

    > 値を変え、他のフォームへ移った時に、値を確定させるために多数使用しています。

    その場合、LostFocus イベントを使わなくても、Validating イベントや Validated イベントを使って値の検証や確定を行うコードにしておいて、別のフォームに移る前にフォームの Validate メソッドを実行するという方法もあると思います(Windows フォームとしては、これが一般的な方法だと思います)。
    この方法がアプリケーションの仕様に合わない場合は、LostFocus で処理してもいいと思います。

    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 1:22
  • 一般的に、プロパティウインドに無かったら、使って欲しくないということですか?

    テキストボックスの_LostFocusイベントもプロパティウインドウにイベントが
    ありませので、自力でやっていますが、同じことなのかも知れませんね。

    こちらは既に多数使っていまして、機能的にもぜひ欲しいものです。
    特に問題が発生しているとも感じていませんが、
    何かマズイコトが発生するかも知れないということですか。
    とりあえずは今のまま行くしかないと思っていますが、悩ましいですね。

    _LostFocusイベントを使っている理由は、複数のフォームを使っていまして、
    値を変え、他のフォームへ移った時に、値を確定させるために多数使用しています。

    LostFocusイベントの使用は推奨されていません。かわりにLeaveイベントを使用してください。

    Control.LostFocus イベント (System.Windows.Forms)

    --リンク先より引用ここから

     GotFocus イベントおよび LostFocus イベントは、WM_KILLFOCUS Windows メッセージおよび WM_SETFOCUS Windows メッセージに結び付けられた、下位のフォーカス イベントです。 一般的に、GotFocus イベントおよび LostFocus イベントは、UICues を更新するとき、またはカスタム コントロールを作成するときにだけ使用されます。 代わりに、Activated イベントおよび Deactivate イベントを使用する Form クラスを除くすべてのコントロールに、Enter イベントおよび Leave イベントを使用する必要があります。

    -- 引用ここまで

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 3:07
  • この場合、機能的にはTH01さんが提示されているように、Validatedイベントが適切に思います。入力された値に応じて動作するようですし。
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 3:57

すべての返信

  • private void groupBox1_Enter(object sender, EventArgs e)

    {
    // 処理。。。
    }

    はどうですか?

    2010年12月17日 2:44
  • プロパティウィンドウには表示されていませんが、コードでイベントハンドラを設定できます。

    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
    
        groupBox1.MouseDown += new MouseEventHandler(groupBox1_MouseDown);
      }
    
      void groupBox1_MouseDown(object sender, MouseEventArgs e)
      {
        MessageBox.Show("MouseDown");
      }
    }
    

    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答の候補に設定 Pinokio-k 2010年12月17日 4:40
    • 回答としてマーク クサキ 2010年12月17日 7:48
    2010年12月17日 2:57
  • groupBox1_Enterはダメでした。

    groupBox1.MouseDown += new MouseEventHandler(groupBox1_MouseDown);
    とすることにより出来るようになりました。ありがとうございました。

    ところで、他のコントロールにはあるのに、VB6.0の時はあるのに、
    なぜ、無くしてしまっているのでしょうか?
    あまり使って欲しくないということですか?

     

    2010年12月17日 7:48
  • 調べてみましたが使ってほしくないようです。GroupBox.MouseDownイベント より

    この API は、.NET Framework インフラストラクチャをサポートします。独自に作成したコードから直接使用するためのものではありません。

    [BrowsableAttribute(false)]
    public event MouseEventHandler MouseDown

    • 回答としてマーク クサキ 2010年12月21日 0:26
    2010年12月17日 8:09
  • わざわざ
    [Browsable(false)]
    public new event EventHandler ~
    のように new してまで隠しているのですね。

    使ってほしくない理由がどこかに書かれてないかなと思って検索してみると、次のスレッド(英語)で質問されている人がいました。

    Why does GroupBox not have a MouseMove event?
    http://stackoverflow.com/questions/1710795/why-does-groupbox-not-have-a-mousemove-event

    難しくて理解できなかったのですが、理由は何かあるみたいですね。(^^;
    (Windows の仕様にかかわるみたいです。)

    リンク先に書かれている通り、FlatStyle の値を既定の "Standard" から "System" に変更してみると確かにイベントは発生しなくなりますね。
    使わないで済むような仕様に変更できれば、使わない方が良いかもしれませんね。

    MouseHover がそのまま表示されるのは漏れですかね。

    追記:本当は隠されているだけなので使っても問題ないと言いたくて調べたんですが、結論が逆になっちゃいました。(^^;

    • 編集済み TH01 2010年12月17日 9:15 追記
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月17日 8:59
  • 一般的に、プロパティウインドに無かったら、使って欲しくないということですか?

    テキストボックスの_LostFocusイベントもプロパティウインドウにイベントが
    ありませので、自力でやっていますが、同じことなのかも知れませんね。

    こちらは既に多数使っていまして、機能的にもぜひ欲しいものです。
    特に問題が発生しているとも感じていませんが、
    何かマズイコトが発生するかも知れないということですか。
    とりあえずは今のまま行くしかないと思っていますが、悩ましいですね。

    _LostFocusイベントを使っている理由は、複数のフォームを使っていまして、
    値を変え、他のフォームへ移った時に、値を確定させるために多数使用しています。

    2010年12月20日 0:38
  • > 一般的に、プロパティウインドに無かったら、使って欲しくないということですか?

    LostFocus イベントの説明には、佐祐理さんが引用されたような文言は書かれてないです。
    なので使ってもいいと思います!

    表示しないようになっているのにはそれぞれに理由があるはずで、LostFocus についてはたぶん、LostFocus イベントの「メモ」に書かれていることだと思います。

    > 値を変え、他のフォームへ移った時に、値を確定させるために多数使用しています。

    その場合、LostFocus イベントを使わなくても、Validating イベントや Validated イベントを使って値の検証や確定を行うコードにしておいて、別のフォームに移る前にフォームの Validate メソッドを実行するという方法もあると思います(Windows フォームとしては、これが一般的な方法だと思います)。
    この方法がアプリケーションの仕様に合わない場合は、LostFocus で処理してもいいと思います。

    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 1:22
  • 一般的に、プロパティウインドに無かったら、使って欲しくないということですか?

    テキストボックスの_LostFocusイベントもプロパティウインドウにイベントが
    ありませので、自力でやっていますが、同じことなのかも知れませんね。

    こちらは既に多数使っていまして、機能的にもぜひ欲しいものです。
    特に問題が発生しているとも感じていませんが、
    何かマズイコトが発生するかも知れないということですか。
    とりあえずは今のまま行くしかないと思っていますが、悩ましいですね。

    _LostFocusイベントを使っている理由は、複数のフォームを使っていまして、
    値を変え、他のフォームへ移った時に、値を確定させるために多数使用しています。

    LostFocusイベントの使用は推奨されていません。かわりにLeaveイベントを使用してください。

    Control.LostFocus イベント (System.Windows.Forms)

    --リンク先より引用ここから

     GotFocus イベントおよび LostFocus イベントは、WM_KILLFOCUS Windows メッセージおよび WM_SETFOCUS Windows メッセージに結び付けられた、下位のフォーカス イベントです。 一般的に、GotFocus イベントおよび LostFocus イベントは、UICues を更新するとき、またはカスタム コントロールを作成するときにだけ使用されます。 代わりに、Activated イベントおよび Deactivate イベントを使用する Form クラスを除くすべてのコントロールに、Enter イベントおよび Leave イベントを使用する必要があります。

    -- 引用ここまで

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 3:07
  • この場合、機能的にはTH01さんが提示されているように、Validatedイベントが適切に思います。入力された値に応じて動作するようですし。
    • 回答としてマーク クサキ 2010年12月21日 0:27
    2010年12月20日 3:57
  • > LostFocusイベントの使用は推奨されていません。かわりにLeaveイベントを使用してください。
    LeaveイベントはフォームがDeactiveになる時は通りませんので、LostFocusイベントを使っています。

    やはり、隠れているということは使って欲しくないのかもしれません。
    ただ、下位のものでも使えるのなら、使ってもかまわないようにも思えます。

    Validating イベントや Validated イベントは使ったことが無いのですが、
    こちらを使って行くべきのようであり、勉強してみます。

    いろいろ、情報ありがとうございました。

    2010年12月21日 0:22