目前在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行就是我的目标。
答案 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