C # Как проверить, если форма уже открыта в компактной структуре - PullRequest
0 голосов
/ 12 октября 2011
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?

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Как писал @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));
1 голос
/ 12 октября 2011

Коллекция Application.OpenForms не существует в Compact Framework.

Вам нужно будет свернуть свою собственную коллекцию и таким образом отслеживать ее.

Существует хороший учебник здесь , который объясняет, как этого добиться.

0 голосов
/ 12 октября 2011

Вы можете иметь статическое логическое поле на всех ваших формах.Затем вам нужно будет создать пару методов для его переключения и привязать к нему обработчики событий открытия и закрытия.По общему признанию, это не самое элегантное решение.

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

Либо это, либо создайте коллекцию форм где-нибудь, и каждый раз, когда форма загружается, она сохраняет в себе ссылку на себя и повторяет ее, чтобы проверить, еслиформа открыта / существует

...