【问题标题】:user control controling containing form用户控件控制包含表单
【发布时间】:2014-02-09 14:30:08
【问题描述】:

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

用户控件名为activate1

包含用户控件(和其他内容)的表单被命名为 form1

目前我正在尝试在激活 1 上的蒙版文本框完成时启用 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

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

我怎样才能做到这一点

【问题讨论】:

  • 您可以在 UserControl 上添加一个 RT 属性,允许您传递表单引用,或者尝试在 usercontrol 上使用 .FindForm。总的来说,听起来有些东西最好由一个班级来解决。
  • 我根据stackoverflow.com/questions/18191450/…的建议选择了usercontrol
  • 你能解释一下我尝试 Dim myform As Form = Form1.SimpleButton1.FindForm() 时 findform 的语法,它似乎不起作用,其他一切都将语法标志设置为关闭
  • 您可以从 Usercontrol 内部执行此操作:frm = Me.FindForm。那么 UC 可以参考表单控件:frm.Button1.Enabled。为按钮引用设置 UC 道具可能比假设它会在那里更好。

标签: vb.net winforms recursion


【解决方案1】:

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

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

请注意,这种方法将您的 Form 和您的 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。

【讨论】:

  • 引发的顶部选项:WindowsApplication19.exe 中发生“System.NullReferenceException”类型的异常,但未在用户代码中处理底部选项使应用程序不稳定,我不得不恢复到旧版本只是为了让设计师再次工作
  • @JamesStafford:我已经更新了示例,以便它也可以在设计器中使用。显然 ParentForm 在设计时没有设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2020-02-09
相关资源
最近更新 更多