如何将表单作为函数vb.net的参数传递

时间:2014-10-22 16:53:43

标签: vb.net

目前在VB.NET中我有两个公共子类,如下:

Public Sub addmember1()
    'Stuff
End Sub

Public Sub furtherinfo1()
    'suff
End Sub

我没有在“'stuff”中包含代码,因为它非常长并且在每个sub中完全相同,但是原理的基础保持不变。

根据布尔值运行某个子。像这样...

If add_member = True Then
    addmember1()
ElseIf add_member = False Then
    furtherinfo1()
End If

我如何使用一个功能执行与上述相同的步骤? (我当前的解决方案有效,但涉及重复相同的代码段两次)

我尝试了以下但不成功

Public Function forms(ByVal frm As Windows.Forms.Form)
    'stuff
End Function

然后像这样运行函数...(addmember和Furtherinfo是我正在使用的两种形式)

        If add_member = True Then
            forms(addmember)
        ElseIf add_member = False Then
            forms(furtherinfo)
        End If

这里是所有上下文代码的粘贴框,它是模块化的,我想用它来将信息写入word文档。第20-71,76-128,160-164行就是我的目标。

http://pastebin.com/xWD0RBuh

3 个答案:

答案 0 :(得分:1)

您可以将表单对象传递给模块中的Sub(),如下所示

模块打印

Dim StrToAdd As String
Sub MySub(ByVal frm As Form)
    'The first line is your code
    StrToAdd = "Firstname:  " & addmember.txtName.Text
    'Change it to as below using frm.Controls("controlname").Text
    StrToAdd = "Firstname:  " & frm.Controls("txtName").Text
End Sub

结束模块

答案 1 :(得分:0)

http://pastebin.com/xWD0RBuh查看代码后,您似乎拥有一个包含多个子例程的全局模块。每个子例程都引用了表单实例上的控件(如文本框)。这意味着每个全局模块子例程都需要有权访问此表单实例。

您只复制了部分应用程序 - 全局模块,但尚未复制到表单定义中。我假设你有一个名为addmember的表单,但我没有在示例中看到它 - 除了全局模块中的引用。

不确定如何使用子例程 - 可能只需单击一个按钮。如果是我,我将创建一个类对象,其中包含要传递数据的属性 - 您要打印的表单上的每个控件都有一个属性。单击该按钮,我将创建该类的实例,并将表单控件中的值复制到类属性中。然后我会将类的实例传递给子例程,我会改变子例程以引用类的实例而不是表单的实例。这将在表单(UI)和行为(打印的子例程)之间提供级别抽象。我甚至可能会“疯狂”并使用界面。

您的代码是否按原样编译?

答案 2 :(得分:0)

问题是你的两个表格是两个不同的类。即使你命名了你的控件 同样,您只能通过frm.txtUsername访问它们。

您可以做的是遍历每个表单的所有控件并按名称查找它们:

Public Sub DoStuff(frm As Form)
    Dim txtUsername As TextBox = GetControlByName(frm, "txtUsername")
    txtUsername.Text = "Hello World"
End Sub

Private Function GetControlByName(container As Control, name As String) As Control
    Dim retVal As Control = Nothing
    If Not TryGetControlByName(container, name, retVal) Then Throw New ApplicationException("control not found")
    Return retVal
End Function

Private Function TryGetControlByName(container As Control, name As String, ByRef ctl As Control) As Boolean
    For Each item As Control In container.Controls
        If item.Name = name Then
            ctl = item
            Return True
        End If

        'If item is a Container (like GroupBox, Panel) check its children
        If TryGetControlByName(item, name, ctl) Then Return True
    Next
    Return False
End Function

如果你想真正想要的话,你可以使用通用控件定义一个Class并通过一点点填充它们 一点反思魔法。虽然这可能有点过头了:

Public Sub DoStuff2(frm As Form)
    Dim wrapper As New CommonForm(frm)
    wrapper.txtUsername.Text = "Hello Wolrd"
End Sub

Public Class CommonForm
    Public Property txtUsername As TextBox
    Public Property txtFoo As TextBox
    Public Property txtBar As TextBox
    'Add more Controls here...

    Public Sub New(frm As Form)
        For Each item In Me.GetType().GetProperties()
            Dim value = GetControlByName(frm, item.Name)
            item.SetValue(Me, value, Nothing)
        Next
    End Sub

    Private Function GetControlByName(container As Control, name As String) As Control
        Dim retVal As Control = Nothing
        If Not TryGetControlByName(container, name, retVal) Then Throw New ApplicationException("control not found")
        Return retVal
    End Function

    Private Function TryGetControlByName(container As Control, name As String, ByRef ctl As Control) As Boolean
        For Each item As Control In container.Controls
            If item.Name = name Then
                ctl = item
                Return True
            End If

            'If item is a Container (like GroupBox, Panel) check its children
            If TryGetControlByName(item, name, ctl) Then Return True
        Next
        Return False
    End Function

End Class