我想检查是否打开了表单实例并打开现有实例来更新文本框,否则创建一个新实例。
搜索后我发现: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
(我已经捕获了),代码不起作用,因为如果实例已经存在,它仍然会创建一个新实例。
我做错了什么?
答案 0 :(得分:0)
更好的方法是根据表单类型过滤OpenForms:
var form2collection = Application.OpenForms.OfType<Form2>();
然后您可以遍历这些,或者如果集合为空,则打开一个新表单。优点是您不依赖于表单名称,而是表单的实际类定义,这更加可靠。
此外,我倾向于避免直接操纵其他代码的控件。如果其他人调用方法,我发现它更可靠,例如
public void setSomeControl(string value)
{
this.controlName.Text = value;
}
然后致电
form2collection[0].setSomeControl("new value");
允许您的表单执行所有内务处理,并且调用代码可以忽略这些详细信息。