[C#]MenuStripドロップダウンアイテムのチェック切り替え | Assertion Failed!

[C#]MenuStripドロップダウンアイテムのチェック切り替え

MenuStrip内のリストのチェック状態を切り替える


[環境]

VisualStudio2008

C# Windowsフォームアプリケーション


Assertion Failed!-menuStrip


上記のように、「テスト」メニューが「テスト1」をもち、その「テスト1」がさらに

「サブアイテムX」の3つのアイテムをもっているとき、チェック状態を排他的に

切り替える(ラジオボタンのように扱う)方法。


各アイテムがクリックされたときに、全てのサブアイテムにたいして

Checkedプロパティをtrue/falseで切り替えるのは美しくないので

メソッドにまとめる。


そんなことするヤツいねーよと言われるかも知れないが、コレを調べだすまでは

上記の方法でやっていた。

実現したときはちょっとした感動。つか、Frameworkで対応しろよ。


マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!


[デザイナ]

テスト1

 Name:_menuTest1


サブアイテム1

 Name:_menuSub1


サブアイテム2

 Name:_menuSub2

 CheckOnClick:true


サブアイテム3

 Name:_menuSub3


[コード]

_menuSub1/2/3 の 「Click」クリックイベントハンドラと、それらを排他的に切り替える

メソッド、「SelectCheckedItem(適当な名前)」を用意する。



/// サブアイテム1Clickイベントハンドラ

private void _menuSub1_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// サブアイテム2Clickイベントハンドラ

private void _menuSub2_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// サブアイテム3Clickイベントハンドラ

private void _menuSub3_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// チェック状態切り替え

private void SelectCheckedItem(object sender)

{

  foreach (ToolStripMenuItem item in _menuTest1.DropDownItems)
  {
    if (item.Equals(sender))
    {
      item.Checked = true;
    }
    else
    {
      item.Checked = false;
    }
  }

}


サブアイテムを3つもつ、親のToolStripMenuItemである_menuTest1がもつ

プロパティ、DropDownItemsforeachでまわして、チェックされたオブジェクトと

等しかったらチェックを有効にしている。