4

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

表格1:

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 上的按钮时,我想关闭(显式处理)在 form1 类中创建的 form2 对象。此编辑是为了更加清晰。

4

5 回答 5

7

关于处理表单的 MSDN 文档:

如果使用 Show 方法显示表单,则会自动调用 Dispose。如果使用了其他方法(如 ShowDialog),或者根本不显示表单,则必须在应用程序中自己调用 Dispose。

来源

关于关闭与处置:

当窗体关闭时,对象内创建的所有资源都将关闭并释放窗体。您可以通过处理 Closing 事件并设置作为参数传递给事件处理程序的 CancelEventArgs 的 Cancel 属性来防止在运行时关闭窗体。如果您要关闭的表单是应用程序的启动表单,则您的应用程序将结束。

表单未在 Close 上处理的两种情况是: (1) 它是多文档界面 (MDI) 应用程序的一部分,并且表单不可见;(2) 您已经使用 ShowDialog 显示了表单。在这些情况下,您将需要手动调用 Dispose 以将表单的所有控件标记为垃圾回收。

于 2009-04-06T11:41:45.777 回答
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();
    }
}
于 2009-04-06T12:00:07.730 回答
1
  1. 您不需要在表单上显式调用 Dispose,垃圾收集器会为您执行此操作。

  2. 如果您希望在 Form2 “消失”时发生特定的事情,您可以挂钩它的表单关闭事件。

编辑 :

在 Form2 上,单击按钮,尝试

this->Close();

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

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

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

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

于 2009-04-06T08:55:17.503 回答
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()。

于 2009-04-06T11:53:00.213 回答
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);

    }
于 2011-01-31T20:00:35.117 回答