我正在尝试创建一个可重用的函数,可以打开单个表单实例。表示如果表单尚未打开,则应创建并显示新表单,如果已经打开,则应将现有表单放在前面。
我使用了以下功能,
if (Application.OpenForms["FPSStorageDemo"] == null)
{
FPSStorageDemo fp = new FPSStorageDemo();
fp.Name = "FPSStorageDemo";
fp.Show();
}
else
{
((FPSStorageDemo)Application.OpenForms["FPSStorageDemo"]).BringToFront();
}
但是我必须一次又一次地编写这段代码,无论我必须打开表格。但我需要一个可以重复使用的功能来完成这项工作。
我写了一个像
这样的函数void OpenSingleInstanceForm(Type TypeOfControlToOpen)
{
bool IsFormOpen = false;
foreach (Form fm in Application.OpenForms)
{
if (fm.GetType() == TypeOfControlToOpen)
{
IsFormOpen = true;
fm.BringToFront();
break;
}
}
if (!IsFormOpen)
{
Object obj = Activator.CreateInstance(TypeOfControlToOpen);
//obj.Show(); //Here is the problem
}
}
但最后我不知道如何展示新的表单实例。任何人都可以建议怎么做?这是错的还是有另一种方法可以做到这一点?
提前致谢。
答案 0 :(得分:1)
public static class FormUtility
{
public static FormType GetInstance<FormType>() where FormType : Form, new()
{
FormType output = Application.OpenForms.OfType<FormType>().FirstOrDefault();
if(output == null)
{
output = new FormType();
}
//you could add the show/bring to front here if you wanted to, or have the more general method
//that just gives a form that you can do whatever you want with (or have one of each).
return output;
}
}
//elsewhere
FormUtility.GetInstance<Form1>.BringToFront();
我还想花点时间提一下,虽然这样的方法快速且易于使用,但在大多数情况下它们并不是很好的设计。它引导您进行全局访问表单的做法,而不是通过在适当的范围内公开适当的信息来确保表单需要彼此通信时。它使程序更易于维护,理解,扩展,增加可重用性等。如果您无法确定两个或多个表单的最佳通信方式,而无需借助对表单的公共静态引用(这正是Application.OpenForms
)那么你应该随时在这里发布这个问题,以帮助你解决。
答案 1 :(得分:0)
您正在寻找Singleton