用户控件控件包含表单

时间:2014-02-09 14:30:08

标签: vb.net winforms recursion

我使用vb.net winforms创建一个包含用户控件的应用程序,我也在创作用户控件。

用户控件名为activate1

包含usercontrol(和其他内容)的表单名为form1

目前我正在尝试在activate1上的maskedtextbox完成时启用form1上的按钮

我尝试通过以下方式执行此操作:

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged
    If MaskedTextBox1.Text.Count = 34 Then
        Form1.SimpleButton1.Enabled = True
    Else
        Form1.SimpleButton1.Enabled = False
    End If
End Sub

然而,我在运行应用程序时遇到错误“在构造期间从默认实例引用自身的形式,导致无限递归”,所以我尝试了

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged
    If MaskedTextBox1.Text.Count = 34 Then
        me.SimpleButton1.Enabled = True
    Else
        me.SimpleButton1.Enabled = False
    End If
End Sub

然而这个标志并且不允许编译,因为我指的是用户控件中不存在的按钮

我该如何完成这个

1 个答案:

答案 0 :(得分:1)

第一个错误的原因是您使用类型名称来引用Form1,您需要父窗体的具体实例。您可以访问ParentForm - 属性:

来访问父表单
Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged
    Dim form = TryCast(ParentForm, Form1)
    If form IsNot Nothing Then
        If MaskedTextBox1.Text.Count = 34 Then
            form.SimpleButton1.Enabled = True
        Else
            form.SimpleButton1.Enabled = False
        End If
    End If
End Sub

请注意,此方法会严密地将您的表单和UserControl耦合在一起。虽然它可以工作,但它会降低UserControl的可重用性(实际上,您只能在Form1上使用它而不能在其他表单上使用它)。虽然你可以改善这一点,例如通过创建一个接口,但UserControl将始终以某种方式绑定到支持此按钮的表单 更可重用的方法是在UserControl中引发事件并以父表单处理它,例如:

Public Class ActivationInfoEventArgs
    Inherits EventArgs

    Public Property Completed As Boolean
End Class

Public Event ActivationInfoChanged As EventHandler(Of ActivationInfoEventArgs)

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged
    Dim completed As Boolean
    If MaskedTextBox1.Text.Count = 34 Then
        completed = True
    Else
        completed = False
    End If
    RaiseEvent ActivationInfoChanged(Me, New ActivationInfoEventArgs() With { .Completed = completed })
End Sub

您在Form1中为事件添加处理程序,并(取消)激活此处理程序中的按钮。这样,您就可以在更多种类的表单上使用UserControl。