none
サブメニュー付きのメニューを入力不可にする方法 RRS feed

  • 質問

  • System.Windows.Formsでアプリケーションを構築しています。

    MenuStripでサブメニュー付きのメニュー項目『A』があるとします。
    サブメニュー込みで『A』自体をEnable = false; と設定すると、
    『A』は灰色表示になって選択できなくなります。
    このとき、確かに兄弟メニューの範囲ではクリックしてもサブメニューは表示されないのですが、
    他にサブメニューを持つメニュー項目『B』がありそれをクリックしてサブメニューを表示させ、
    ついで『A』にマウスカーソルを移動させると『A』のサブメニューが表示されてしまいます。

    これを回避するにはどのようにすればいいのでしょうか?
    2009年11月26日 10:35

回答

すべての返信

  • 過去の同一内容のスレッドを紹介しておきます。
    http://social.msdn.microsoft.com/forums/ja-JP/vbgeneralja/thread/e3c57e6a-09cf-4b34-82eb-ceb68f21f7ce/

    http://social.msdn.microsoft.com/Forums/ja-JP/vsfeedbackja/thread/90d0ac3c-d1b7-415b-8775-5bfddb778cd5

    Connect に登録されているアイテム。(開発チームから回避策の投稿あり)
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=117127
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kanryu 2009年11月27日 1:15
    2009年11月26日 15:01
    モデレータ
  • このバグはVS2008でも直っていないようですね。 VS2008 sp1ではどうなのでしょう? kanryuさんの環境は何でしょうか? VS2010(.NET Framework 4)ではどうなのかな? 時間がある時に調べてみたいと思います。

    Disabled ToolStripMenuItem may open sub items
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=117127&wa=wsignin1.0


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年11月26日 15:02
    モデレータ
  • このバグはVS2008でも直っていないようですね。 VS2008 sp1ではどうなのでしょう? kanryuさんの環境は何でしょうか? VS2010(.NET Framework 4)ではどうなのかな? 時間がある時に調べてみたいと思います。
    少なくとも、.NET Framework 3.5 SP1 までは放置されています。
    VS2010 Beta2(JPN) で、.NET 4 をターゲットにしても同一の現象が発生を確認しています。

    恐らく、今回に放置されると思います。
    (比較的早い段階で発見できるし、回避策を打てばそんなに苦労しないので優先度が低くみられている)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年11月26日 15:30
    モデレータ
  • Deleted
    2009年11月26日 23:21
  • Connect に登録されているアイテム。(開発チームから回避策の投稿あり)
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=117127
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    ありがとうございます。こちらのページに書かれていた回避策を使って問題が発生しなくなったことを確認しました。
    DropDownOpeningイベントではなく、DropDown.Opening イベントにハンドラを登録するのがミソで、
    (おいおい! ややこしすぎる!)
    e.Cancel = true;
    をセットしてあげるとドロップダウンが出なくなるようです。

    試みにサブクラス化してみましたが、こんな感じでいけるようです。
    ToolStripMenuItemのメニューをToolStripParentMenuItemに置き換えることで、
    Enabled = false;のときにサブメニューが表示されなくなります。
    public class ToolStripParentMenuItem : ToolStripMenuItem
    {
        public ToolStripParentMenuItem()
        {
            DropDown.Opening += new CancelEventHandler(DropDown_Opening);
        }
        protected void DropDown_Opening(object sender, CancelEventArgs e)
        {
            e.Cancel = !Enabled;
        }
    }
    
    まあ、上の記事のとおりにやっても手間はあまり変わらないと思いますが。

    >環境は?
    Visual Studio 2008 SP1です。直ってはないですね。

    しかし、MenuStripはチェックボックス化がいまいち使いにくいし、そもそもラジオボタンがサポートされてないし、
    いやいやそもそもFormsのラジオボタンはAccessみたいにグループ化されたラジオボタンから選択中の値を取り出す方法が標準で存在しないし、もうちょっと使いやすくしてくれたらと思います。
    2009年11月27日 1:22