我慢慢得到了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中不存在 当前背景
答案 0 :(得分:0)
mnuContextMenu
仅存在于AddContextMenu
范围内。
您有几个选择:
this.ContextMenuStrip.Text = "Hello World";
或:
((ContextMenuStrip) sender).Text = "Hello World";
第一个有效,因为您已将本地mnuContextMenu
存储在类别ContextMenuStrip
中。第二种方法将发送方参数(将事件引发的对象)强制转换为ContextMenuStrip。
答案 1 :(得分:0)
有一个原因是所有事件处理程序方法在.NET世界中都具有完全相同的签名。您可能已经注意到sender
和e
参数总是,无论您处理哪个事件。它们提供您需要的所有信息。
在这种特殊情况下,您正在寻找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建议的解决方案可能会起作用,或者您将对象的引用保留为类的私有成员。