2011-04-20 84 views
3

我有两个窗体窗体应用程序,我们称之为FormA.exe(父级)和FormB.exe(子级)。 FormB.exe是可以单独运行的应用程序。 FormA.exe是另一个应用程序,其功能之一是呼叫FormB.exe将一个Windows窗体设置为另一个Windows窗体的MDI子窗体(或等价物)

我有两个应用程序的源代码,我可以修改它们。

当前每当FormA.exe想呼叫FormB.exe时,我会使用Process类来启动FormB.exe进程。问题是,

  1. 我不知道如何通过这两个Form s之间的消息。
  2. FormB.exe会从FormA叫唤,它会出现用户为另一应用,独立的FormA.exe,但我想它显示为一个单一的应用程序FormA下,与FormB作为MDI子。
  3. FormB本身是一个计量吸入器。所以如果我把它作为MDI载入,我会得到这个错误System.ArgumentException: Form cannot be both an MDI child and MDI parent
  4. 如果我不加载为MDI,则我的FormB无法正常工作。换句话说,FormA的全部用途都已丢失。

有没有其他的办法---除了设置FormB作为MDI孩子FormA - 使一个winform应用程序完全包含在另外一个,让他们互相通信?

+0

更好的方式做,这是摆在同一过程中这两种形式,你可以做,因为你的代码 – 2011-04-20 08:58:23

+0

@大卫,这是一项巨大的工作量。 – 2011-04-20 09:24:37

+0

也许很多工作,但至少有成功的前景 – 2011-04-20 10:29:44

回答

0

您可以将FormA.exe中的项目引用添加到FormB.exe,并以编程方式将formb作为mdi子项加载以形成。

然后您可以轻松地在它们之间传递消息。 FormB.exe仍然可以作为应用程序自行调用,只是将其保存为Windows应用程序而不是Windows库项目。

+0

@Noel,你能更明确吗?你是说我可以使用['System.Reflection.Assembly.LoadFrom'](http://social.msdn.microsoft.com/Forums/en-IE/winforms/thread/ae8062a5-cd8e-4450-a4ce-d8430e93c79e )?我如何在两个应用程序之间传递消息? – 2011-04-20 07:34:03

+0

如果您有源代码,则不需要使用反射。您可以为FormA项目打开VS解决方案,并将项目引用添加到FormB。然后,您可以在FormA中编写代码,将FormB与您的解决方案中的任何其他项目一样对待。 – 2011-04-20 08:01:11

+0

要传递一个消息,你只需调用FormB中的类的方法,没有任何魔法发生,它只是被视为另一个DLL。 – 2011-04-20 08:01:49

1

我同意诺尔

有很多方法可以实现你正在尝试。这样做的一种方法是使用System.Reflection

这样在备考

Assembly a = Assembly.LoadFrom("WindowsApplication1.exe"); 
     Form frm = a.CreateInstance("WindowsApplication1.FormB") as Form; 
     frm.MdiParent = this; 
     frm.Show(); 
+0

@Subhash,但你如何在'FormA'和'FormB'之间传递消息? – 2011-04-20 07:44:56

+0

@Conditional再次改变有多种方式,但我方便的方式是实现接口 像 'IMdiParent FORMA = this.parent为IMdiParent' 和 'ICHILD formB = FRM作为IChild' – 2011-04-20 07:59:59

+0

@Subhash,嗯,你的代码不工作,因为'FormB'本身是一个MDI表单,请参阅更新的问题。 – 2011-04-20 08:10:03

相关问题