解决  控件和事件

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
经过与VB.NET的多年合作,我正在开发C#技能。我很难找出控件可以使用哪些事件,以及如何将事件处理程序与我要使用的事件相关联。

在VB中,我将单击表单上的控件,然后将添加默认的事件处理程序。例如,单击一个文本框并添加
VB.NET:
    Private Sub txt1ry_TextChanged_1(sender As Object, e As EventArgs)  提手  txt1ry.TextChanged

    End Sub
当然,C#会发生完全相同的情况
C#:
        private void txtLastName_TextChanged(object sender, EventArgs e)
        {
 
        }
C#代码甚至看起来更加整洁。但是,如果我想要其他事件类型该怎么办?使用VB.NET,我可以单击事件处理程序中的任何位置,Visual Studio会向我显示该控件可用的所有事件处理程序的列表。
1597895192050.png


我可以单击其中的一个以为控件插入另一个事件处理程序,或者(如您从图像中的代码片段所见),可以更改Handles子句以将原始TextChanged代码切换到另一个事件。

我在用C#做类似的事情时遇到困难。如果单击txtLastName_TextChanged的事件处理程序,则会看到此消息,它不会给我与txtLastName相关的事件列表,我在VB.NET中发现它非常方便。
1597896063188.png


此外,我发现如果删除不需要的事件处理程序(如txtPhoneo_TextChanged),我的表单将不再编译。如果添加类似txtLastName_Validated的事件处理程序,它将被忽略,但不会自动进行连接。即使我确实知道事件名称,也不知道如何连接事件名称。

那我不明白吗?我猜想Visual Studio中有一些我没有正确设置的简单技术或选项,它们会使C#与VB.NET一样方便。

谢谢罗伯特·巴恩斯。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
您提到的第二个选项,即代码窗口上方的导航栏,不能用于在C#中生成事件处理程序。它通过查找声明的字段在VB中工作 WithEvents C#中没有这样的东西或等效的东西。 VB具有用于创建控件的事件处理程序的第三个选项,并且C#中存在相同的选项。该选项是设计器中的“属性”窗口。该窗口中的工具栏具有在属性和事件之间切换的按钮。您只需单击“事件”按钮,然后可以双击一个事件以生成事件处理程序,也可以从下拉列表中选择一个现有事件。在VB和C#中,此选项还允许您同时为多个控件生成或选择事件处理程序,而这不能通过其他任何方式自动完成。

删除事件处理程序也可以在“属性”窗口中完成。因为C#没有等效于 WithEvents 提手 ,您不能简单地删除带有 提手 clause to detach an event handler. C# uses the += operator to attach event handlers, which works in much the same way as the AddHandler VB中的关键字。设计器生成事件处理程序时,会将注册事件处理程序的代码行添加到设计器代码文件中。如果仅删除该方法,则该行会保留下来,因此是指不再存在的方法,因此会导致编译错误。就像清除属性值一样,您可以在“属性”窗口中右键单击事件处理程序,然后选择“重置”,以清除事件处理程序。这样做只会删除设计器代码,因此您仍然需要自己删除方法本身。
 

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
啊哈!感谢约翰的一个非常快速,简单和正确的答案!现在我知道了,这很简单。事后思考:为控件创建一个新的事件处理程序现在非常简单,但是删除它(当我发现它不是我想要的那个)并不简单。我以为,只需使用右键单击/重置,就可以删除VB HANDLES子句的等效项,然后删除事件处理程序代码。不是这样!我还在搜寻。我明天再来。
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
我以为只要使用右键单击/重置,就可以删除VB HANDLES子句的等效项
鉴于没有等效项,这将很难。在VB中, 提手 子句与声明的字段关联 WithEvents 。事件处理程序始终为分配给该字段的对象处理指定的事件。更改字段的值,该方法现在正在为另一个对象处理事件。没有与C#中的等效。 VB AddHandler statement associates an event handler with a specific object 和 the C# += operator does the same thing.

假设在VB中,您添加了一个 标签 到表单,然后为 鼠标点击 事件通过“属性”窗口。在设计器代码文件中,您将获得以下信息:
VB.NET:
Friend  WithEvents   标签 1 As  标签 
和这个:
VB.NET:
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(0, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(39, 13)
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
并在用户代码文件中获得以下信息:
VB.NET:
Private Sub  标签 1_MouseClick(sender As Object, e As MouseEventArgs)  提手   标签 1.MouseClick

End Sub
如果在C#中执行相同的操作,则会得到以下信息:
C#:
private System.Windows.Forms.Label label1;
这个:
C#:
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
this.label1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick);
和这个:
C#:
private void label1_MouseClick(object sender, MouseEventArgs e)
{

}
如您所见,没有 提手 C#中的子句,但在设计器代码中注册。完成此操作后,我进入了两个项目的“属性”窗口,右键单击 鼠标点击 事件并选择重置。在这两种情况下,方法都从用户代码文件中删除,注册也从C#中的设计者代码文件中删除。

我再次尝试了相同的操作,但是这次,我添加了一个呼叫 MessageBox.Show 在事件处理程序中。在这种情况下,设计器代码文件中的注册已在C#中删除,并且 提手 在VB中已删除子句,但未删除任何事件处理程序。我使用“属性”窗口中的下拉列表重新附加了事件处理程序,从事件处理程序中删除了方法调用,然后再次使用“重置”分离了事件处理程序。这次,整个方法在C#中被删除,而只有 提手 已在VB中删除。这就是VS 2019中的全部内容。
 
最佳 底部