2017-02-19 53 views
0

我将一个Windows窗体应用程序从VB转换为C#。重新包含MDIchild表格

简而言之,我有一个formLocation()类中的方法,其中传递一个窗体(双击时触发),窗体可以重置为MainForm的MDIChild。由于某些原因,此VB代码不会转换为C#。它迫使我创建一个MainForm的新实例,这是不理想的,因为子窗体必须进入MainForm的当前实例。这里是VB代码:基本上,我只需要在C#相当于:

Public Sub contain(ByVal form As Form) 
    With form 
     .MdiParent = MainForm 
    End With 
End Sub 
+1

如果需要进入实例,则将MainForm的实例传递给方法...我看不出问题是什么。因此,为什么它要求你创建一个新的实例,因为它不知道MainForm是什么... – Codexer

+0

忘记VB.NET的可怕的默认实例功能将需要一段时间。最简单的解决方法是form.MdiParent = Application.OpenForms [0]; –

回答

0

VB创建的这是由同名的窗体类,这在历史上已经造成了很多混乱的访问形式的默认实例 - 所有以保存几行代码的名义。

在你 '的MainForm' 类,插入以下内容:

private static MainForm _DefaultInstance; 
public static MainForm DefaultInstance 
{ 
    get 
    { 
     if (_DefaultInstance == null) 
      _DefaultInstance = new MainForm(); 

     return _DefaultInstance; 
    } 
} 

现在,你的代码更改为:

form.MdiParent = MainForm.DefaultInstance; 

这是为了重现什么VB为你做的最接近的方式,但你最终应该转向更加标准的实例化表单的方式。如果将VB转换为C#,您会遇到很多其他的情况,其中VB隐藏程序员隐藏细节的良好意图阻止了对编程概念(例如实例vs类型)的基本理解。

+0

是的!我遇到了“无尽的”情况,VB的“好意”让我头痛。 – Matt

+0

非常感谢!这解释了很多!但是,这不会出错,但表单不会返回到mainForm。双击它的mdiparent = null时不会将其重置为主窗体 – Matt

+0

@Matt这是因为您需要对上述主要表单实例的引用。创建一个新的将不会帮助,因为它不是你以后的实例... – Codexer