找出表单的哪个实例启动了另一个表单或模块

时间:2010-10-05 15:00:49

标签: .net vb.net

我正在尝试找出在模块中引用表单上的控件的最佳方法。不幸的是,表单只是一个实例,所以它不像调用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号将是我的偏好,因为我不想像那样传递表格。

4 个答案:

答案 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)

以模式方式致电frmPrintFormfrmPrintForm.Show(ME)。 然后,您可以使用frmPrintForm.Parent获取对frmSearch

的调用实例的引用