我正在尝试找出在模块中引用表单上的控件的最佳方法。不幸的是,表单只是一个实例,所以它不像调用form.control那么容易......
Dim ChildForm As New frmSearch
' Make it a child of this MDI form before showing it. '
ChildForm.MdiParent = Me
ChildForm.Show()
该表单有一个打印选项,可以调用另一个选择某些选项的表单。打印表单依次调用模块中的函数,该模块尝试引用回原始表单。
childform as new frmSearch -> frmPrintForm -> sub okToPrint (in module Print)
okToPrint尝试在frmSearch上引用listview,但找不到它。
For Each itmX In frmSearch.lstResults.Items
因此,我能想到的解决方案是:
不知何故,神圣的形式是frmPrintForm的调用者
2.将ChildForm传递给frmPrintForm作为要传递给模块Print的变量。
3.直接使用frmSearch而不是使用它的实例。
1号将是我的偏好,因为我不想像那样传递表格。
答案 0 :(得分:2)
我犹豫不决,因为这是“要求downvotes”,但为了完整起见我还是会提到它:如果你确保只展示一个搜索表单,你可以全球存储对“搜索”表单的引用。 (是的,我说“全局变量”,现在继续下去投票。:-P)
Public Class frmSearch
...
Private Shared currentSearchForm As frmSearch
Public Shared ReadOnly Property Current() As frmSearch
Get
Return currentSearchForm
End Get
End Property
Public Sub New()
''# Do your constructor stuff here
...
currentSearchForm = Me
End Sub
End Class
这样您就可以使用frmSearch.Current
访问上次打开的搜索表单了。请注意,此解决方案具有通常与全局变量相关的所有缺点,但我认为它最类似于您在VB6中习惯使用的内容。
上面的代码是为了给你一般的想法,有很多改进的余地(使构造函数变为私有并使用Shared
方法来确保没有打开表单的第二个实例; set {表单关闭时{1}}到currentSearchForm
等。)
再次提到这一点,将相关数据传递给打印表单是一个更清晰的解决方案,但最终,决定权归你所有,你应该知道所有可用的选项。
答案 1 :(得分:1)
我可以推荐选项#4:传递只是你可以从lstResults.Items获得的项目吗?你不再传递形式(我认为这是一件坏事),甚至不依赖于从表格中调用。
答案 2 :(得分:1)
不要传递表单,传递数据。选择打印选项后,循环遍历frmSearch
结果,将数据放入一些适当的数据结构(可能是包含某些元素的列表),将此数据传递给frmPrintForm,然后传递给okToPrint。
是的,这意味着需要更多参数,但这也意味着您的表单frmPrintForm
和您的子okToPrint
不再依赖frmSearch
的详细信息。这样可以更轻松地重复使用您的打印功能并更改搜索表单中的内容,而无需担心在完全不相关的模块中破坏某些内容。
答案 3 :(得分:0)
以模式方式致电frmPrintForm
:frmPrintForm.Show(ME)
。
然后,您可以使用frmPrintForm.Parent
获取对frmSearch