处理在另一个表单上定义的控件事件

时间:2014-01-09 11:59:23

标签: vb.net winforms events

我有一个声明为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

2 个答案:

答案 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