FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
}
OR
Form fc = Application.OpenForms["FORMNAME"]; if (fc != null) fc.Close(); fm.Show();
但不适用于紧凑框架3.5。如何检查表格是否已在CF 3.5中打开?
答案 0 :(得分:2)
正如@Barry所写,你必须自己做。最简单的方法是使用字典。您的密钥可以是表单的类型,名称或您需要的任何内容。
private static readonly Dictionary<string, MyForm> _dict
= new Dictionary<string, MyForm>();
public MyForm CreateOrShow(string formName)
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = new MyForm();
_dict.Add(formName, f);
}
return f;
}
或者,如果您想支持多种表单类型并希望避免强制转换,请使用通用方法:
private static readonly Dictionary<string, Form> _dict
= new Dictionary<string, Form>();
public T CreateOrShow<T>(string formName) where T : Form, new()
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = new T();
_dict.Add(formName, f);
}
return (T)f;
}
public T CreateOrShow<T>(string formName, Func<T> ctor) where T : Form
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = ctor();
_dict.Add(formName, f);
}
return (T)f;
}
有两个通用重载。其中一个使用如下:
// use this if MyFormType has a parameterless constructor
var form = CreateOrShow<MyFormType>("Form1");
或者,如果您需要在init期间将参数传递给表单:
// use this if MyFormType accepts parameters in constructor
var form = CreateOrShow<MyFormType>("Form1", () => new MyFormType(someData));
答案 1 :(得分:1)
答案 2 :(得分:0)
您可以在所有表单上都有一个静态布尔字段。然后,您必须创建几个方法来切换它,并将Opening和Closing事件处理程序绑定到它。诚然,这不是最优雅的解决方案。
partial class Form1 : Form
{
static bool IsFormOpen;
public Form1()
{
InitializeComponent();
this.Load += SignalFormOpen;
this.FormClosing += SignalFormClosed;
}
void SignalFormOpen(object sender, EventArgs e)
{
IsFormOpen = true;
}
void SignalFormClosed(object sender, EventArgs e)
{
IsFormOpen = false;
}
}
或者在某处创建表单集合,每次表单加载时都会在其中存储对自身的引用,并对其进行迭代以检查表单是否已打开/存在