如何检查窗体是否已经存在,如果是,则打开它,如果不存在,则创建一个新窗体?

时间:2016-01-14 14:41:31

标签: c# forms winforms

我基本上想要这样做:

VBA.Strings.Split()

我有一个表单,显示添加到订单的商品列表,但当我转到另一个页面并导航回订单表单时,它会调用if (form.isOpen() == true) form.ShowDialog(); else form f = new form(); ,我相信会重置该表单。有关如何克服这一问题的任何建议吗?

4 个答案:

答案 0 :(得分:1)

使用静态属性Application.OpenForms

YourFormType f = Application.OpenForms.OfType<YourFormType>().FirstOrDefault();
if (f != null)
    f.ShowDialog();
else
{
    using(f = new YourFormType())
    {
        f.ShowDialog();
    }
}

但是我不知道这是否能解决你的问题。您可能最好将表单与其支持数据分开并使用绑定来连接两者。导航回来时,只需将支持数据传递给表单的新副本即可。请查看MVVM等概念以获取更多信息。

答案 1 :(得分:0)

您可以使用Application.OpenForms()

查看打开的表单
if (Application.OpenForms().OfType(Of form).Any)
    Application.OpenForms().OfType(Of form).First.ShowDialog();
else
    form f = new form();

答案 2 :(得分:0)

如果您调用ShowDialog(),则无法转到同一应用程序中的其他表单(直到您有多个UI线程)。如果你的意思是Show()而不是ShowDialog我会说你只有一个

     Form _form;

在你的班级中添加一些保护代码,就像那样(通用的想法):

     void ShowOrCreate()
     {
        if(_form==null)
        {
            _form = new MyForm();
            _form.Closed += OnMyFormClosed();
            _form.Show();
        }
        else
        {
            _form.BringToFront();
        }
      }

      void OnMyFormClosed(...)
      {
         _form = null;
      }

很抱歉遗漏了部分和方法签名,我相信可以在MSDN中轻松查看。

答案 3 :(得分:0)

一种单例,假设您需要每个应用程序的给定表单的单个实例:

public MyForm: Form
{
    private static MyForm _instance;

    public static MyForm Instance
    {
        get
        {
            if(_instance == null)
                _instance = new MyForm();
            return instance;
        }
    }
}

现在您只需使用MyForm.Instance即可。请注意,使用此方法,您不希望永远调用MyForm.Instance.Close()(或者您必须重新创建实例)。使用Show/Hide(无模式)或ShowDialog/Hide(模态)。

相关问题