プロが教える店舗&オフィスのセキュリティ対策術

C♯ 2段構造のcontextMenuStripの消去原因の判別法

コンテクストメニューのイメージ
・A
・B b1
・  b2
・  b3
・C
・D
上記のように項目Bのみが更にサブ項目b1~3を持っているcontextMenuStripを作りました

A、C、Dを選択するとe.CloseReasonはItemClickedになります
またcontextMenuStrip以外の箇所を選択するとAppFocusChangeになります

問題はサブ項目b1を選択すると、期待しているItemClickedにならずAppFocusChangeで戻ってしまうことです
サブ項目もcontextMenuStripの中ですから当然ItemClickedと思っていたのですが・・・・・・

【注】b1を選択するとb1のイベントハンドラーは正常に起動しb1対応の処理をしてくれます

e.CloseReasonの戻り値によりNortifyIconとcontextMenuStripの再接続を行っているので、b1選択でAppFocusChangeであると判断に困ります

propatiyに何らかの設定があるかと考えて調べてはみましたが判然としません
ぜひご指導お願い申し上げます

A 回答 (1件)

フォームクラスに ToolStripItem型の変数を用意しておいてサブメニューのDropDownItemClickedイベントでこの変数に代入するようにします



contextMenuStripのClosingイベントで e.CloseReason のチェックとともにこの変数がnullかどうかで判断してはいかがでしょう

// nullで初期化しておく
private ToolStripItem subMenu = null;

  private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
  {
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked || subMenu != null)
    {
      notifyIcon1.ContextMenuStrip = null;
      subMenu = null;
    }
  }

  // サブメニューの有るメニュー項目の DropDownItemClickedイベント
  private void menuBToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
  {
    subMenu = e.ClickedItem;
  }
    • good
    • 0
この回答へのお礼

重ね重ねのご指導ありがとうございます

お教え頂いた方法で問題を解決することが出来ました

今後とも宜しくお願い申し上げます

ありがとうございました

お礼日時:2012/02/10 23:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!