我使用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
然而这个标志并且不允许编译,因为我指的是用户控件中不存在的按钮
我该如何完成这个
答案 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。