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

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

コントロールのコンテキストメニューを作成しようとしていますメインメニュー項目にリンクされています。常にそこにある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は2

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