有没有更好的方法来检查表单是否已加载?

时间:2012-10-25 13:48:01

标签: c# winforms

我的应用中有2个表单,Form1Form2。我想知道是否有 检查表单是否已加载的更好方法。如果表格是 加载到内存中并且可见,如果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 个答案:

答案 0 :(得分:5)

您无需让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的结束事件。

答案 1 :(得分:2)

我用

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

因此,每次关闭form2时,引用都会设置为null。下次可以重新实例化。

只要它仍然存在,就把它带到前面。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您要显示表单,表单将抛出一个名为Form.Shown

的事件

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

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

我认为这也是一个有形式的事件,但我不记得我的头脑。