WinForms でコンテキスト メニューのメニュー項目を動的に選択する正しい方法は何ですか?

StackOverflow https://stackoverflow.com/questions/103514

  •  01-07-2019
  •  | 
  •  

質問

メインメニュー項目に「リンク」されているコントロールのコンテキストメニューを作成しようとしています。常に存在する 2 つの固定メニュー項目と、メニューに含める必要がある任意の数の追加メニュー項目があります。

私は、固定メニュー項目と動的メニュー項目のリストへのクラスレベルの参照を保持することで問題を解決しようとしました。どちらのメニューも扱っております』 Opening イベントを削除するには、現在の項目リストをクリアしてから、適切な項目をメニューに追加します。これはメイン メニューでは正常に機能しますが、コンテキスト メニューの動作がおかしくなります。

大きな問題は、その時点で Opening が表示されると、メニューは表示する項目をすでに決定しています。このフォームは次のことを示しています。

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

初めてフォームを右クリックしたときは、何も表示されません。2 回目では、メニューが期待どおりに表示されます。アイテムを更新できる別のイベントが発生しますか?メニュー項目を動的に選択するのは悪い習慣ですか?

(注記:これは、そのような機能が欲しい人のために私が作り始めた例であり、それがどれほど難しいかについて興味があったので、なぜこれが行われるかについての詳細を提供することはできません。この人は、メイン メニュー項目をコンテキスト メニューに「リンク」したいと考えています。メニュー項目は 1 つのメニューの子にのみなれるため、これはそうするための合理的な方法であると思われました。アプローチに関する代替案があれば歓迎します。)

役に立ちましたか?

解決

コントロールの MouseDown イベント中に項目を解決できます。マウスの右ボタンであることも確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top