2

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

搜索后我发现:如何检查一个windows窗体是否已经打开,如果是则关闭它?

从我尝试的接受的答案

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(我已经在捕获),该代码不起作用,因为如果一个实例已经存在,它仍然会创建一个新实例。

我究竟做错了什么?

4

1 回答 1

0

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

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

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

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

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

然后打电话

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

这允许您的表单完成所有的内务管理,并且调用代码可以忽略这些细节。

于 2013-10-03T21:27:42.047 回答