c#如何检查表单是否已经在compact框架中打开
本文关键字:compact 框架 是否 何检查 检查 表单 | 更新日期: 2023-09-27 18:11:08
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
}
或
Form fc = Application.OpenForms["FORMNAME"]; if (fc != null) fc.Close(); fm.Show();
,但在紧凑框架3.5中不起作用。我如何检查表单是否已经在CF 3.5中打开?
正如@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");
或者,如果您需要在初始化期间向表单传递参数:
// use this if MyFormType accepts parameters in constructor
var form = CreateOrShow<MyFormType>("Form1", () => new MyFormType(someData));
Application.OpenForms
collection在Compact Framework中不存在。
你必须滚动你自己的集合,这样才能跟踪它们。
这里有一个很好的教程,解释了如何实现这一点
您可以在所有表单上使用静态布尔字段。然后,您必须创建两个方法来切换它,并将open和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;
}
}
或者在某个地方创建一个表单集合,每次表单加载时,让它在其中存储一个对自身的引用,并迭代检查表单是否打开/存在