C# 如何将自定义控件属性创建为窗体,并且该属性具有项目中所有窗体的选项?

C# 如何将自定义控件属性创建为窗体,并且该属性具有项目中所有窗体的选项?,c#,.net,vb.net,winforms,windows-forms-designer,C#,.net,Vb.net,Winforms,Windows Forms Designer,我正在用VB.Net开发一个winform项目。在这个项目中,我从UserControl继承了一个自定义按钮,并将FormName属性添加为Form。因此,我可以将FormName属性与单击自定义按钮时程序将打开的表单一起分配。该属性实际上显示在Visual Studio属性面板中,但仅将窗体本身显示为唯一选项,并且我们不能从同一项目中选择其他窗体 这是该属性的代码 <Browsable(True), Description("Set the Form Name")> Public

我正在用VB.Net开发一个winform项目。在这个项目中,我从UserControl继承了一个自定义按钮,并将FormName属性添加为Form。因此,我可以将FormName属性与单击自定义按钮时程序将打开的表单一起分配。该属性实际上显示在Visual Studio属性面板中,但仅将窗体本身显示为唯一选项,并且我们不能从同一项目中选择其他窗体

这是该属性的代码

<Browsable(True), Description("Set the Form Name")> Public Property FormName As Form
    Get
        Return _formName
    End Get
    Set(ByVal value As Form)
        _formName = value
    End Set
End Property
预期的输出是一个自定义控件属性作为表单,它具有项目中所有表单的选项

请帮我解决这个问题。提前谢谢

编辑:

Private Sub Button_Click(sender As Object, e As EventArgs) Handles cbtnPurchase.Click, cbtnPurchaseReturn.Click, cbtnSales.Click, cbtnSalesReturn.Click, cbtnMutationIn.Click, cbtnMutationOut.Click, cbtnSwitchWarehouse.Click, cbtnOpname.Click, cbtnCakery.Click
    Try
        Dim btn As customButton = CType(sender, customButton)
        If ExitForm Then Return
        openForm(btn.FormName)
    Catch ex As Exception
        MsgTryCatch(ex.Message)
    End Try
End Sub

假设字符串属性对您来说足够好,在VB.NET项目中,您可以依靠
My.Forms
按名称获取表单并显示它:

Public Class MyButton
    Inherits Button
    Public Property Form As String
    Protected Overrides Sub OnClick(e As EventArgs)
        If (Not String.IsNullOrEmpty(Form)) Then
            Dim fp = My.Forms.GetType().GetProperty(Form)
            If (fp IsNot Nothing) Then
                Dim f = fp.GetValue(My.Forms)
                DirectCast(f, Form).ShowDialog()
            End If
        End If
        MyBase.OnClick(e)
    End Sub
End Class
如果您有兴趣获得更好的设计时支持,请查看以下帖子:


假设字符串属性对您来说足够好,在VB.NET项目中,您可以依靠
My.Forms
按名称获取表单并显示它:

Public Class MyButton
    Inherits Button
    Public Property Form As String
    Protected Overrides Sub OnClick(e As EventArgs)
        If (Not String.IsNullOrEmpty(Form)) Then
            Dim fp = My.Forms.GetType().GetProperty(Form)
            If (fp IsNot Nothing) Then
                Dim f = fp.GetValue(My.Forms)
                DirectCast(f, Form).ShowDialog()
            End If
        End If
        MyBase.OnClick(e)
    End Sub
End Class
如果您有兴趣获得更好的设计时支持,请查看以下帖子:


非常感谢,按姓名填写表格没有帮助。我可以显示表单,但无法与控件正确交互,因为同一表单有两个实例。我用String属性和表单本身的主实例创建了一个。它很容易处理。您可以检查Application.OpenForms是否包含具有指定名称的表单,只需显示打开的表单,否则创建表单的新实例并显示它。请参阅我的openForm代码,我已尝试使用Application.OpenForms检查表单是否已打开。如果它已打开,则bringtofront;如果它未打开,则调用frm.Show()。但是它不起作用,因为在此之前,我已经通过创建一个新实例打开了表单。调用openForm函数后,我想访问表单控件,如frmSupplier.txtSearch.Text=“SupplierCode”。它只是不起作用,因为我显示的表单是frmSupplier的新实例,但我的“SupplierCode”被分配给了主frmSupplier实例。这是我的结论,cmiiw…非常感谢,按姓名填写表格没有帮助。我可以显示表单,但无法与控件正确交互,因为同一表单有两个实例。我用String属性和表单本身的主实例创建了一个。它很容易处理。您可以检查Application.OpenForms是否包含具有指定名称的表单,只需显示打开的表单,否则创建表单的新实例并显示它。请参阅我的openForm代码,我已尝试使用Application.OpenForms检查表单是否已打开。如果它已打开,则bringtofront;如果它未打开,则调用frm.Show()。但是它不起作用,因为在此之前,我已经通过创建一个新实例打开了表单。调用openForm函数后,我想访问表单控件,如frmSupplier.txtSearch.Text=“SupplierCode”。它只是不起作用,因为我显示的表单是frmSupplier的新实例,但我的“SupplierCode”被分配给了主frmSupplier实例。这是我的结论,cmiiw。。。