2014-10-20 128 views
0

我知道这是一个非常讨论的问题,但我没有找到很好的答案。 我有一个包含Form1(DataGridView列表)的实例的MainForm,它具有子窗体Form2(包含从Form1中选择的记录的详细信息)。 Form1可以有多个实例(可以加载到不同的独立选项卡中),Form2可以作为独立表单载入到选项卡中或(作为实例)加载到Form1中作为选定记录的详细信息。VB.NET在子窗体的子窗体(实例)中运行父窗体(实例)

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

  1. 获取父参考像

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

    ...这是有道理的,因为情况总是成对出现。但上面的代码不适用于我,我无法从ParentForm1访问“MyRefreshSub()”。也许我宣布了一些不正确的...

  2. 接口 - 我读了很多使用接口的建议,但我没有找到一个使用接口刷新父窗体的单例

有人能指点我一个解决方案吗?

问候,

Libor的

+0

你的问题很混乱。标题询问一件事,然后'我如何从Form2运行Form1中的一个子'似乎想要相反。也就是说,'Dim theParentForm1 As Form = TryCast(Me.Owner,Form)'不会有太大帮助,因为在System.Windows.Forms.Form中没有定义MyRefreshSub。尝试使用'Form1'或其他类实际上拥有该方法的方式进行投射。 – Plutonix 2014-10-20 12:04:00

+0

谢谢,但这不起作用,我会写在下面的答案下描述它 – 2014-10-20 13:18:00

+0

我怀疑这是一个XY问题开始。我强烈怀疑你的子表单的概念是将表单嵌入到TabPage中,如果是这种情况,你可能会提到这一点,因为这是一件很奇怪的事情。否则,你将不得不扩大“这不工作”。如果'MyrefreshSub'是Public并且'thisForm'被转换为包含它的form类的一个实例,那么'thisForm.MyRefreshSub'应该可以工作。 – Plutonix 2014-10-20 13:46:15

回答

0

你可以做@Plutonix发布和投父窗体到Form1并调用子

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

感谢您的建议,但这只对MainForm有效,而不针对Form1。实际上,如果使用.Owner或.ParentForm或.ParentForm.ParentForm,它总是将MainForm引用为父级,而不是Form1。我可以从主窗体中引用Form1作为myParentForm.Form1。nameofSubToRun(),但它然后(显然)抛出一个错误“对象引用未设置为对象的实例。”... – 2014-10-20 14:13:49

+0

你得到NRE,因为TryCast失败。这意味着所有者不是“Form1”的实例,您的trycast会针对每种表单类型进行更改。更明确的父引用而不是所有者也会有所帮助。 @ user3260548 – Plutonix 2014-10-20 14:46:43

+0

我同意,但我不知道我应该怎么做,我不知道任何其他参考父表格的方式,我真的没有看到任何适用于这种情况的例子在互联网上... – 2014-10-20 15:28:47

0

OK,在此基础上Plutonix提出了建议,我去了另一个方向,并决定采取一种解决方法 - 更新所有的 Form1的实例。它的工作方式如下:

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