c#如何检查表单是否已在紧凑框架中打开

时间:2011-10-12 12:53:35

标签: c# compact-framework

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
}

OR

Form fc = Application.OpenForms["FORMNAME"]; if (fc != null) fc.Close(); fm.Show();

但不适用于紧凑框架3.5。如何检查表格是否已在CF 3.5中打开?

3 个答案:

答案 0 :(得分:2)

正如@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");

或者,如果您需要在init期间将参数传递给表单:

// use this if MyFormType accepts parameters in constructor
var form = CreateOrShow<MyFormType>("Form1", () => new MyFormType(someData));

答案 1 :(得分:1)

Compact Framework中不存在Application.OpenForms集合。

您必须滚动自己的收藏并以这种方式跟踪它们。

nice tutorial here解释了如何实现这一目标。

答案 2 :(得分:0)

您可以在所有表​​单上都有一个静态布尔字段。然后,您必须创建几个方法来切换它,并将Opening和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;
    }
}

或者在某处创建表单集合,每次表单加载时都会在其中存储对自身的引用,并对其进行迭代以检查表单是否已打开/存在