检查表单是否已打开,如果打开则更新

时间:2013-10-03 21:18:39

标签: c# winforms

我想检查是否打开了表单实例并打开现有实例来更新文本框,否则创建一个新实例。

搜索后我发现:How to check if a windows form is already open, and close it if it is?

从我接受的答案中我试过

try
{
    foreach (Form fm in Application.OpenForms)
    {
        if (fm is Form2)
        {
            Form2 n1 = (Form2)Application.OpenForms["Form2"];
            n1.textBox1.Text = textBox1.Text;
            break;
        }
        else
        {
            Form2 n1 = new Form2();
            n1.textBox1.Text = textBox1.Text;
            n1.Show();
        }
    }
}
catch (InvalidOperationException)
{
}

除此之外,此代码抛出InvalidOperationException(我已经捕获了),代码不起作用,因为如果实例已经存在,它仍然会创建一个新实例。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

更好的方法是根据表单类型过滤OpenForms:

var form2collection = Application.OpenForms.OfType<Form2>();

然后您可以遍历这些,或者如果集合为空,则打开一个新表单。优点是您不依赖于表单名称,而是表单的实际类定义,这更加可靠。

此外,我倾向于避免直接操纵其他代码的控件。如果其他人调用方法,我发现它更可靠,例如

public void setSomeControl(string value)
{
    this.controlName.Text = value;
}

然后致电

form2collection[0].setSomeControl("new value");

允许您的表单执行所有内务处理,并且调用代码可以忽略这些详细信息。