0

我的应用程序中有 2 个表单,Form1并且Form2. 我想知道是否有更好的方法来检查表单是否已经加载。如果表单已加载到内存中并且可见,我希望按钮什么也不做,如果User 已关闭表单,它应该重新实例化它。

有关更多信息,请查看我的代码或评论.. :)

public partial class Form1: Form
{
    private Form2 form2;

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {

        if (form2== null) {
            form2= new Form2();
        } else {
            if (form2.has_exited()) { // this is a private property
                                      // that I set when Form2.Closing executes
                form2.Dispose();
                form2= new Form2();
            }
        }
        form2.Show();
    }
}
4

4 回答 4

6

您不需要Form2处理关闭事件,您可以直接从Form1

private Form2 form2;

private void button1_Click(object sender, EventArgs e)
{
    if (form2 == null)
    {
        form2 = new Form2();
        form2.FormClosed += (_, arg) =>
        {
            form2 = null;
        };
        form2.Show();
    }
    else
    {
        //the other form has been opened and not closed; not sure what you want to do
    }
}

另请注意,如果通过Show您显示表单,则无需处理它。如果您显示它,ShowDialog那么您会这样做,但是当您使用非模态对话框时,系统会自动将事件处理程序附加到调用 dispose 的关闭事件。

于 2012-10-25T13:53:44.597 回答
3

我会用

if (form2 == null)
{
    form2 = new Form2();
    form2.FormClosed += (s, e) => { this.form2 = null; };
    form2.Show();
}
form2.BringToFront()

所以每次form2关闭时,参考设置为null. 下次可以重新实例化。

只要它还在那里,就把它带到前面。

于 2012-10-25T13:54:30.773 回答
0

您可以将 Form1 传递给 Form2,并且在 .Loaded 之类的事件中或在 Form2 中处理/退出时,您可以使用 Form1 对象让它知道这些事件已经发生。

于 2012-10-25T13:51:13.277 回答
0

如果您正在显示表单,该表单将引发一个名为 Form.Shown 的事件

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx

您可以在那里放置某种处理代码(即使它只是设置一个标志)。同样,如果用户关闭它,则会有一个表单关闭/关闭事件。

我认为也有一个表单加载事件,但我不记得了。

于 2012-10-25T13:51:55.017 回答