2008-09-03 134 views
3

我需要从Windows应用程序的子窗体中关闭父窗体。什么是最好的方法来做到这一点?如何从Windows Forms 2.0中的子窗体关闭父窗体?

+0

不知道你所说的 “子窗体” 的意思。也许这是一个窗体上的面板上的按钮?或者它是一个MDI的东西?或者是孩子形成一个对话框? – 2008-09-03 02:31:18

回答

3

当您在WinForms中关闭表单时,它会处理它的所有子项。所以这不是一个好主意。您需要异步执行此操作,例如,您可以向父窗体发送消息。

0

Form类没有提供对“父”表单的任何引用,所以没有直接访问父表的方法(除非碰巧也是MDI父表,在这种情况下,您可以访问它通过MDIParent属性)。您必须在子构造函数或属性中传递对父项的引用,然后记住设置它,然后使用该引用强制父项关闭。

0

也许考虑让父母订阅一个关于孩子的事件,并且孩子只要想关闭父母就可以触发该事件。父母可以处理它自己的关闭(和孩子一起)。

0

你很明显是使用正确的方式打开和关闭窗体。如果您使用任何形式的MVC或MVP,则不会出现此问题。

所以使用MVP或MVC的形式来解决这个问题。

0

我同意davidg;您可以添加到父窗体的子窗体的构造函数的引用,然后关闭父窗体,因为你需要:

private Form pForm; 
public ChildForm(ref Form parentForm) 
{ 
    pForm = parentForm; 
} 

private closeParent() 
{ 
    if (this.pForm != null) 
     this.pForm.Close(); 
    this.pForm = null; 
} 
+0

我有同样的问题,这种解决方案不适用于我的情况。 也在第二个表格我开始一个线程,这是否造成问题。 – Posto 2009-11-05 13:51:28

4

我碰到这个博客条目,看起来像它会工作运行和它使用的事件处理程序从D2VIANT概念答案

http://www.dotnetcurry.com/ShowArticle.aspx?ID=125

摘要: 第1步:创建一个新的Windows应用程序。打开Visual Studio 2005或2008.转到文件>新建>项目>在“项目类型”> Windows应用程序中选择Visual Basic或Visual C#。给项目一个名称和位置>确定。

步骤2:在项目中添加一个新的 表格。右键单击项目>添加> Windows窗体> Form2.cs>添加。

第3步:现在在Form1中,拖放一个按钮'btnOpenForm'并双击它以生成事件处理程序。在其中写入以下代码。同时添加frm2_FormClosed事件处理程序,如下图所示:

private void btnOpenForm_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); 
     frm2.Show(); 
     this.Hide(); 
    } 


    private void frm2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.Close(); 
    } 
0

有一个非常简单的解决方案这一点。

问题(确定):启动应用程序(主窗体)>打开主窗体VIA按钮或任何事件的子窗体>关闭(主窗体)但子窗体也关闭。

解决方案:

用途:Process.Start("Your_App's_EXE_Full_Path.exe");

示例:试试以获得完整的路径:

  1. string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";

  2. Process.Start(FullPath);

  3. this.Close();

    • 这样你会得到保持各种形式要保持开放。