在C#中处理来自父表单的表单?

时间:2009-04-06 08:45:58

标签: c# class forms object dispose

我有一个表单,当单击一个按钮(form1button)时将打开一个新表单。在子表单上会有另一个按钮'form2button'。现在,如果我单击此form2按钮,则应该处理新的form2。但是因为form2对象是在form1类方法中创建的,所以我无法在form2类方法中处理该对象(fom2buttonclick)。所以我使用static来完成我的工作,如下面的伪代码。

Form1中:

class Form1 : Form
{
    static Form2 f2;

    public void Form1_buttonclick(object sender, EventArgs e)
    {
        f2 = new Form2();
    }

    public void Disposef2()
    {
        f2.Dispose();
    }
}

窗体2:

class Form2 : Form
{
    public void Form2_buttonclick(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.Disposef2();
    }
}

还有其他更好的方法吗?或者C#设计本身并不提供替代机制。我是C#的新手。请帮帮我..

修改

我想关闭(明确处置)form2对象,当单击form2上的按钮时,该对象在form1类中创建。这个编辑是为了更清晰。

5 个答案:

答案 0 :(得分:7)

关于处理表单的MSDN文档:

  

将自动调用Dispose   如果使用Show显示表单   方法。如果是另一种方法如   使用ShowDialog,或表单是   从来没有显示过,你必须打电话   把你自己放在你的   应用

Source

关闭与处置:

  

表单关闭时,所有资源   在对象内创建的是关闭的   并且表格处理完毕。您可以   防止在运行时关闭表单   处理Closing事件的时间和   设置的取消属性   CancelEventArgs作为参数传递   到您的事件处理程序。如果形式你   正在关闭的是启动形式   你的申请,你的申请   结束。

     

表单不是的两个条件   处于关闭状态时是(1)它   多文档界面的一部分   (MDI)应用程序,而表单则不是   可见; (2)你已经展示了   使用ShowDialog的表单。在这些   在这种情况下,您需要调用Dispose   手动标记所有表单   控制垃圾收集。

答案 1 :(得分:3)

如果两个表单没有父对话框类型的关系,您可能只想挂钩子窗体上的Disposed事件,以便在关闭时收到通知。

public partial class Form1 : Form
{
    private Form2 _Form2;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_Form2 != null)
            _Form2.Dispose();

        _Form2 = new Form2();
        _Form2.Disposed += delegate
        {
            _Form2.Dispose();
            _Form2 = null;
        };
        _Form2.Show();
    }
}

然后你在Form2中所要做的就是关闭它:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Close();
    }
}

答案 2 :(得分:1)

  1. 您不需要在表单上显式调用Dispose,垃圾收集器会为您执行此操作。

  2. 如果你想在Form2“消失”时发生特定的事情,你可以勾选它的表格结束事件。

  3. 编辑:

    在Form2上,单击按钮,尝试

    this->Close();
    

    这将关闭form2的实例(表单将消失)。如果form1仍然有对form2的引用,那么垃圾收集器将不会获取form2,GC也不会处理它。

    如果form1有理由保留对form2的引用?

    如果是这样,form1应该处理from2的结束事件,然后form1可以释放它对form2的引用(将其设置为null)。

    现在GC将拾取form2作为要收集的候选者,它将(可能不止一步)调用它的Dispose方法并释放Form2的内存。

答案 3 :(得分:1)

你真的不是读者吗?这里已有很多答案。

  

编辑我要关闭(处理   明确地说,form2对象是   按钮打开时在form1类中创建   单击form2。这个编辑是给   更清晰。

如果使用ShowDialog,则在调用close()时返回form2。所以在Form1中:

private void button1_Click(object sender, System.EventArgs e)
{
    Form2 oForm2 = new Form2();
    oForm2.MyParentForm = this;
    if (oForm2.ShowDialog() == DialogResult.OK)
    {
        oForm2.Dispose(); //or oForm2.Close() what you want
    }
}

然后在form2中调用Close()。

答案 4 :(得分:0)

我为我的项目做过一次,关闭一个应用程序并打开另一个应用程序。

    System.Threading.Thread newThread;
    Form1 frmNewForm = new Form1;

   newThread = new System.Threading.Thread(new System.Threading.ThreadStart(frmNewFormThread));
this.Close();
        newThread.SetApartmentState(System.Threading.ApartmentState.STA);
        newThread.Start();

并添加以下方法。你的newThread.Start会调用这个方法。

    public void frmNewFormThread)()
    {

        Application.Run(frmNewForm);

    }