C# 单个可重用函数,用于打开表单的单个实例

C# 单个可重用函数,用于打开表单的单个实例,c#,asp.net,C#,Asp.net,我试图创建一个可重用的函数,它可以打开表单的单个实例。表示如果表单尚未打开,则应创建并显示新表单;如果表单已打开,则应将现有表单置于最前面 我在使用下面的函数 if (Application.OpenForms["FPSStorageDemo"] == null) { FPSStorageDemo fp = new FPSStorageDemo(); fp.Name = "FPSStorageDemo";

我试图创建一个可重用的函数,它可以打开表单的单个实例。表示如果表单尚未打开,则应创建并显示新表单;如果表单已打开,则应将现有表单置于最前面

我在使用下面的函数

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
            }
        }
但最后我不知道如何显示新的表单实例。有人能建议怎么做吗?这是错误的还是有其他方法


提前感谢。

您正在寻找
单身人士

选中此

公共静态类FormUtility
{
公共静态FormType GetInstance(),其中FormType:Form,new()
{
FormType输出=Application.OpenForms.OfType().FirstOrDefault();
if(输出==null)
{
输出=新的FormType();
}
//如果愿意,您可以在此处添加show/bring,或者使用更通用的方法
//这只是提供了一种形式,你可以做任何你想做的事(或者每个都有一个)。
返回输出;
}
}
//别处
FormUtility.GetInstance.BringToFront();
我还想花点时间提一提,虽然像这样的方法快速且易于使用,但在大多数情况下,它们不是好的设计。它引导您采取的做法是只全局访问表单,而不是确保表单需要通过适当的范围公开适当的信息来进行相互通信。它使程序更易于维护、理解、扩展、提高可重用性等。如果您无法确定两个或多个表单在不诉诸表单的公共静态引用(这正是
Application.OpenForms
)的情况下进行通信的最佳方式,则然后,您可以在此处随意发布该问题,以便我们帮助您解决。

成功了。((Form)obj.Show();这解决了我的问题
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();