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

本文关键字:compact 框架 是否 何检查 检查 表单 | 更新日期: 2023-09-27 18:11:08

FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
}

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

,但在紧凑框架3.5中不起作用。我如何检查表单是否已经在CF 3.5中打开?

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

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

或者,如果您需要在初始化期间向表单传递参数:

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

Application.OpenForms collection在Compact Framework中不存在。

你必须滚动你自己的集合,这样才能跟踪它们。

这里有一个很好的教程,解释了如何实现这一点

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

或者在某个地方创建一个表单集合,每次表单加载时,让它在其中存储一个对自身的引用,并迭代检查表单是否打开/存在