【问题标题】:Adding event on no-referenced object c#在无引用对象c#上添加事件
【发布时间】:2021-01-30 15:38:55
【问题描述】:

我有一个像这样动态创建的菜单:

ContextMenu MenuNote = new ContextMenu();
    
MenuNote.MenuItems.AddRange(new MenuItem[]
{
      new MenuItem() { Name = "open", Text = "Ouvrir"},
      new MenuItem() { Name = "mute", Text = "Sourdine"},
      new MenuItem() { Name = "exit", Text = "Quitter" }
});

我没有创建引用,因为之后我不需要这些对象,除了它们各自的事件。

然后我尝试做这样的事情,但我收到一个我无法识别的错误:

new MenuItem() { Name = "open", Text = "Ouvrir"}.Click += new EventHandler(MenuOpen_Click)

我收到此错误,而我对“将事件添加到未引用对象”的研究对我没有帮助

无法将类型“void”隐式转换为 'System.Windows.Forms.MenuItem'

我真的需要为每个项目创建引用我只是语法错误吗?

谢谢

【问题讨论】:

  • 确切地说:您的 MenuItem 对象引用,因为它们是MenuNote.MenuItems 集合的一部分;你只是没有分配任何变量。您仍然可以使用MenuNote.MenuItems[index] 访问它们。
  • @KlausGütter 是的,你是对的,如果我没有使用正确的话,对不起。事实上,由于索引,我设法访问它,但我想知道是否可以在一行中完成它,就像我的例子一样。谢谢你的回复
  • 参见例如在这里:stackoverflow.com/questions/3993601/…。这被考虑用于 C#6,但 AFAIK 从未将其纳入语言。但是,可以为 MenuItem 编写一个扩展方法,允许类似的语法。

标签: c# object events reference


【解决方案1】:

C#6 曾考虑在对象初始化程序中分配事件处理程序,但 AFAIK 从未将其纳入该语言,请参阅 Assigning events in object initializer

您可以编写一个扩展方法,允许您使用流畅的语法添加事件处理程序:

static class MenuItemExtensions
{
    public static MenuItem OnClick(this MenuItem menuItem, EventHandler handler)
    {
        menuItem.Click += handler;
        return menuItem;
    }
}

用途:

MenuNote.MenuItems.AddRange(new MenuItem[]
{
      new MenuItem() { Name = "open", Text = "Ouvrir"}.OnClick(MenuOpen_Click),
      new MenuItem() { Name = "mute", Text = "Sourdine"}.OnClick(MenuMute_Click),
      new MenuItem() { Name = "exit", Text = "Quitter" }.OnClick(MenuExit_Click)
});

【讨论】:

  • 感谢您的回复。我已将主题标记为已解决,但如果唯一的解决方案是另一种方法,我将保留索引为MenuItems[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2010-10-21
  • 2013-11-12
相关资源
最近更新 更多