我有一个声明为s属性WithEvents
的表单。如果我将Handles formServers.FormClosing
添加到Sub
声明,它可以正常工作,但是当我想在formServers
内处理控件事件时,我会收到以下错误 -
类中的'Handles'必须指定'WithEvents'变量。
如何正确设置?感谢。
Private WithEvents formServers As New formServers
Private Sub txtServers_Closing(ByVal Sender As Object,
ByVal e As EventArgs) Handles formServers.txtServers.LostFocus
Me.SetServers()
If Me.ServersError Then
Dim Ex As New Exception("Error validating Servers.")
Dim ErrorForm = New formError(Ex, 101)
End If
End Sub
答案 0 :(得分:2)
错误消息相当误导。 Handles 关键字有几个限制,它不能跨不同的类工作,它需要一个对象引用。您必须使用更通用的 AddHandler 关键字。
您的方案中还存在一些其他问题。切勿使用LostFocus事件,请改用Leave。并且为表单的特定实例订阅事件非常重要,使用As New
会在多次显示表单时遇到麻烦,ObjectDisposedException将成为结果。正确的代码如下所示:
Private formInstance As FormServers
Private Sub DisplayFormServer()
formInstance = new FormServers
AddHandler formInstance.txtServers.Leave, AddressOf txtServers_Closing
AddHandler formInstance.FormClosed, _
Sub()
formInstance = Nothing
End Sub
formInstance.Show()
End Sub
更优雅的方法是在FormServers类中显式公开事件。看起来像这样:
Public Class FormServers
Public Event ServersLeave As EventHandler
Private Sub txtServers_Leave(sender As Object, e As EventArgs) Handles txtServers.Leave
RaiseEvent ServersLeave(Me, EventArgs.Empty)
End Sub
End Class
答案 1 :(得分:1)
问题是您没有在WithEvents
上指定TextBox
。相反,您要在WithEvents
上指定Form
。您只能对使用Handles
关键字直接声明 的变量使用WithEvents
。如果表单上有WithEvents
,您将只能使用Handles
来处理由表单本身直接引发的事件。对于由其任何控件引发的事件,您将无法执行此操作。
您可以通过以下两种方式之一解决此问题。您可以使用AddHandler
注册事件处理程序(而不是使用Handles
关键字),也可以创建TextBox
变量WithEvents
,然后将其设置为适当的表单上的TextBox
对象,就像这样。
Private formInstance As New FormServers
Private WithEvents txtServers As TextBox
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
txtServers = formServers.txtServers
End Sub
Private Sub txtServers_LostFocus(Sender As Object, e As EventArgs) Handles txtServers.LostFocus
' ...
End Sub
后一种方法的优点是,除了更一致,更可能更优雅的语法之外,您不必记得调用RemoveHandler
。