0

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

我正在使用以下功能,

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
            }
        }

但最后我不知道如何显示新的表单实例。有人可以建议怎么做吗?这是错误的还是有其他方法可以做到这一点?

提前致谢。

4

2 回答 2

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)的情况下如何进行最佳通信,那么您应该感到免费在此处发布该问题,以便我们帮助您解决。

于 2012-05-10T05:36:38.670 回答
0

你正在寻找Singleton

检查这个 在 C# 中实现单例

于 2012-05-10T05:18:54.800 回答