【问题标题】:C# How to properly remove event handler code?C#如何正确删除事件处理程序代码?
【发布时间】:2015-05-22 22:51:50
【问题描述】:

我有一个要从 C# Winform 中删除的 keyup 事件:

private void txtInputBox_KeyDown(object sender, KeyEventArgs e)
{
      if (e.KeyCode == Keys.Return)
      {
          cmdSend.PerformClick();
      }
  }

如果我注释掉或删除此函数,我会在表单的设计视图中收到错误:

"设计器无法处理未知名称'txtInputBox_KeyDown' 第 66 行。生成方法“InitializeComponent”中的代码 由设计者自行修改,不得手动修改。请删除任何 更改并尝试再次打开设计器。”

程序也不会编译。

如果我尝试删除表单上的任何事件处理程序代码,就会发生这种情况。我在 VB.NET 和 VB.NET 中自学 C#,我可以毫无问题地删除事件处理程序代码。

【问题讨论】:

  • 从设计器中正确删除
  • 在 VS 的属性窗口中检查字段/文本框的事件处理程序(“照明”符号)并将其删除

标签: c# .net winforms visual-studio visual-studio-2013


【解决方案1】:

这是因为在 Designer.cs 中注册了事件处理程序,当您从其方法后面的代码中删除时,它不会从 Designer.cs 中删除它的事件注册

您应该通过控制 properties 从表单设计器视图中删除事件,这样这个问题就不会来自 Designer.cs 删除事件注册行,如下所示:

SomeTextBox.KeyUp += SomeTextBox_KeyUp

【讨论】:

    【解决方案2】:

    这是因为在 C# 中,当您在设计器中添加函数时,这些函数会由设计器以编程方式添加到事件中。

    在解决方案资源管理器窗口中,展开 Form1.cs 并在那里打开 Form1.Designer.cs 文件:

    然后定位函数:

    private void InitializeComponent()
    

    并删除将事件处理程序注册到事件的行。中间会有一个+= 运算符,如下所示:

    您的活动将位于第 66 行,如下所示:

    this.txtInputBox.KeyDown += new System.EventHandler(this.txtInputBox_KeyDown);
    

    【讨论】:

    • 这是“正确”的做法吗?似乎会有一个更清洁/更快/更官方的选择。 (不是说不正确,我只是在评论)。
    • 这基本上是正确的方法。设计器只是为您可视化它,因此您可以从事件页面下的属性窗口中将其删除,但它与删除此行相同。是从设计器中还是从代码中删除它,由您决定。
    • 正确的方法是通过进入控件属性@TravelinMax 来删除使用设计视图
    【解决方案3】:

    在 Visual Studio 自动生成的设计器代码中,事件仍然链接到这个不存在的函数。

    在解决方案资源管理器中,找到您的 Form.Designer.cs 文件(它位于主 Form.cs 下的子节点中),或使用“在解决方案中查找”功能找到显示的行

    txtInputBox.KeyDown += new System.EventHandler(txtInputBox_KeyDown);
    

    删除该行,它应该会再次工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2012-04-20
      • 2010-11-21
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多