如何解决如何从事件处理程序内部更改ContextMenuItem的属性
|| 我正在慢慢了解ѭ0的含义,这个问题可能是设计不当的结果,但这是可行的。 我因此生成了动态菜单: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在中不存在
当前背景
解决方法
在.NET世界中,所有事件处理程序方法都具有完全相同的签名是有原因的。您可能已经注意到
sender
和e
参数始终存在,无论您正在处理哪个事件。他们提供您需要的所有信息。
在这种情况下,您要查找“ 4”参数,该参数是引发事件的特定控件的引用。
当然,它的类型为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\";
}
}
当有一种非常好的内置方法来获取对所需对象的引用时,绝对没有理由浪费代码来维护对这些对象的类级引用。
, mnuContextMenu
仅存在于AddContextMenu
的范围内。
您有两种选择:
this.ContextMenuStrip.Text = \"Hello World\";
要么:
((ContextMenuStrip) sender).Text = \"Hello World\";
第一个起作用是因为您将本地mnuContextMenu
存储在类属性ContextMenuStrip
中。第二种方法将发送者参数(引发事件的对象)强制转换为ContextMenuStrip。
, 显然,它失败了,因为您将AddContextMenu方法内的上下文菜单对象声明为本地方法变量,而不是将其作为包含类的私有成员。 MegaHerz建议的解决方案可能会起作用,或者您以类的私有成员身份引用对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。