如何从事件处理程序内部更改ContextMenuItem的属性

时间:2011-06-15 14:33:32

标签: c# methods contextmenu

我慢慢得到了C#的悬念,这个问题可能是设计糟糕的结果,但现在这样。

我生成了动态菜单:

public Form1()
{
    InitializeComponent();
    AddContextMenu();
}
public void AddContextMenu()
{
    ContextMenuStrip mnuContextMenu = new ContextMenuStrip();
    mnuContextMenu.ItemClicked+=
              new ToolStripItemClickedEventHandler(mnuContextMenu_ItemClicked);

    this.ContextMenuStrip = mnuContextMenu;

    ToolStripMenuItem mnuItemEnable = new ToolStripMenuItem("Enable");
    mnuContextMenu.Items.Add(mnuItemEnable);
}

和事件处理程序:

private void mnuContextMenu_ItemClicked (Object sender,
                                         ToolStripItemClickedEventArgs e)
{
     //do stuff here
}

如何从事件处理程序中更改mnuContextMenu.Text(或任何其他属性)? VS说:

  

mnuContextMenu中不存在   当前背景

3 个答案:

答案 0 :(得分:0)

mnuContextMenu仅存在于AddContextMenu范围内。

您有几个选择:

this.ContextMenuStrip.Text = "Hello World";

或:

((ContextMenuStrip) sender).Text = "Hello World";

第一个有效,因为您已将本地mnuContextMenu存储在类别ContextMenuStrip中。第二种方法将发送方参数(将事件引发的对象)强制转换为ContextMenuStrip。

答案 1 :(得分:0)

有一个原因是所有事件处理程序方法在.NET世界中都具有完全相同的签名。您可能已经注意到sendere参数总是,无论您处理哪个事件。它们提供您需要的所有信息。

在这种特殊情况下,您正在寻找sender参数,该参数是对引发事件的特定控件的引用。

当然,它被输入为Object,因此您必须将其转换为更加派生的类型才能按照您的意愿使用它。这很直接 - 因为您知道ItemClicked事件仅 将由ContextMenuStrip对象引发,只需直接投射:

private void mnuContextMenu_ItemClicked (Object sender, ToolStripItemClickedEventArgs e)
{
    ((ContextMenuStrip)sender).Text = "Your text";
}

或者,如果您想安全地玩(并且您可能会这样做),请遵循标准惯用法:

private void mnuContextMenu_ItemClicked (Object sender, ToolStripItemClickedEventArgs e)
{
    // Try to cast the object to a ContextMenuStrip
    ContextMenuStrip cmnu = sender as ContextMenuStrip;

    // Verify that the cast was successful
    // (if it failed, the cmnu variable will be null and this test will fail,
    // preventing your code from being executed and your app from crashing)
    if (cmnu != null)
    {
        cmnu.Text = "Your text";
    }
}

当你有一个非常好的,内置的方式来获取你想要的那些内容时,你可以毫无理由地维护对这些对象的类级引用。

答案 2 :(得分:0)

显然它失败了,因为您将AddContextMenu方法中的上下文菜单对象声明为本地方法变量,而不是将其作为包含类的私有成员。 MegaHerz建议的解决方案可能会起作用,或者您将对象的引用保留为类的私有成员。