【问题标题】:VB.NET Run sub in parent (instance of) form from a child (instance) of a subformVB.NET 从子窗体的子(实例)在父(实例)窗体中运行子
【发布时间】:2014-12-15 09:27:48
【问题描述】:

我知道这是一个非常受讨论的问题,但我没有找到好的答案。 我有一个包含 Form1 实例(DataGridView 列表)的 MainForm,它有一个子表单 Form2(包含来自 Form1 的选定记录的详细信息)。 Form1 可以有多个实例(可以加载到不同的独立选项卡中),Form2 可以作为独立表单加载到选项卡中,或者(就是这种情况)作为所选记录的详细信息加载到 Form1 中。

选择记录时,我可以轻松地从 Form1 刷新 Form2(通过定义“Protected f2 As New Form2”,我可以从 Form2 运行 subs)。但是如何从 Form2 运行 Form1 中的子程序?我用谷歌搜索:

  1. 获取父类参考

    Dim theParentForm1 As Form = TryCast(Me.Owner, Form)
    theParentForm1.MyRefreshSub()
    

    ...这是有道理的,因为实例总是成对的。但是上面的代码对我不起作用,我无法从 theParentForm1 访问“MyRefreshSub()”。也许我声明的东西不正确......

  2. Interface - 看了很多关于使用interface的推荐,但是没有找到使用interface刷新父窗体的单个示例

有人能指出我的解决方案吗?

问候,

Libor

【问题讨论】:

  • 你的问题很混乱。标题问一件事,然后how do I run a sub in Form1 from Form2 似乎想要反过来。也就是说,Dim theParentForm1 As Form = TryCast(Me.Owner, Form) 不会有太大帮助,因为在System.Windows.Forms.Form 中没有定义MyRefreshSub。尝试转换为 Form1 或任何实际具有该方法的类。
  • 谢谢,但这不起作用,我会在下面的答案下写下描述
  • 我怀疑这是一个 XY 问题。我强烈怀疑您的子表单概念是将表单嵌入到 TabPage 中,如果是这种情况,您可能会提到这一点,因为这是一件相当奇怪的事情。否则,您将不得不扩展“这不起作用”。如果MyrefreshSub 是Public 并且thisForm 被转换为包含它的表单类的实例,那么thisForm.MyRefreshSub 应该可以工作。
  • 对不起,我花了一些时间在下面发布详细描述。就是如你所说,表单被加载到一个TabControl1.tabpage1 中。我使用这个简单的“框架”已经好几年了,而且效果很好,但直到现在我还没有做反向交叉引用。在我的情况下,编译后,从 Form2 引用 .parent 不会返回对 Form1 的引用,而是返回到 MainForm。我认为这是关键问题。

标签: vb.net interface parent


【解决方案1】:

好的,根据 Plutonix 提出的建议,我采取了另一个方向并决定解决方法 - 更新 Form1 的 ALL 实例。它是这样工作的:

    For Each CurrentForm As Form In Application.OpenForms
        If CurrentForm.Name = "Form1" Then
            Dim Form1Instance As Form1 = DirectCast(CurrentForm, Form1)
            Form1Instance.nameOfSubToRun()
        End If
    Next

【讨论】:

  • 这非常有效。谢谢!但是,如果打开多个具有相同名称的表单,它可能无法正常工作。
  • @user1000008 这确实可能发生。我终于以不同的方式使用它,因此不能混合实例,请参阅我的答案stackoverflow.com/questions/45466186/…。多年来,它已经以多种形式经过实战证明,是一种非常简单可靠的解决方案。
【解决方案2】:

您可以按照@Plutonix 发布的操作,将父表单转换为 Form1 并调用子表单

Dim myParentForm As Form1 = TryCast(Me.Owner, Form1)
myParentForm.nameOfSubToRun()

【讨论】:

  • 感谢您的建议,但这仅适用于 MainForm,不适用于 Form1。实际上,无论您使用 .Owner 或 .ParentForm 或 .ParentForm.ParentForm,它总是将 MainForm 引用为父级,而不是 Form1。我可以将主窗体中的 Form1 引用为 myParentForm.Form1.nameofSubToRun(),但随后它(显然)抛出错误“对象引用未设置为对象的实例。”...
  • 您获得了 NRE,因为 TryCast 失败。这意味着 Owner 不是 Form1 的实例,您的 trycast 会因每种表单类型而改变。更明确的父引用而不是所有者也会有所帮助。 @user3260548
  • 我同意,但我不知道我应该采取什么行动,我不知道引用父表单的任何其他方式,我真的没有看到任何适用于本案例的示例互联网...
  • ...如果我更新了 Form1 的所有实例,那应该很简单,不是吗?这也很有意义......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多