Предотвратите дублирующиеся дочерние формы MDI

По-моему, сделайте следующее:

Для любого нового проекта, следуйте всем правилам FxCop. Можно хотеть отключить некоторых из них, с тех пор не все будет иметь смысл для проекта. Для существующего проекта следуйте правилам от этих категорий как минимальный набор:

  • Глобализация
  • Совместимость
  • безопасность
  • Производительность
  • Мобильность

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

  • Использование Дизайна

, Так как они облегчат для Вас определять ошибки, которые имеют отношение к нарушениям, но у Вас будет большой объем нарушений в существующем коде.

Всегда сортируют нарушения по, выравниваются/устраняют категорию и запускаются с критических. Пропустите предупреждения на данный момент.

В случае, если Вы не знали, существует также StyleCop, доступный от Microsoft, проверяя Ваш код на исходном уровне. Обязательно включите интеграцию MSBuild во время установки.

12
задан Brian Rasmussen 27 July 2012 в 14:32
поделиться

3 ответа

Вы можете взаимодействовать с коллекцией OpenForms, чтобы проверить, существует ли уже форма данного типа:

foreach (Form form in Application.OpenForms)
{
    if (form.GetType() == typeof(MyFormType))
    {
        form.Activate();
        return;
    }
}

Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
35
ответ дан 2 December 2019 в 03:43
поделиться

Насколько я знаю, стандартного способа нет. Вам придется реализовать это самостоятельно. Я бы сделал это следующим образом:

class TheForm: Form
{
    private static TheForm Instance;

    private TheForm() // Constructor is private
    {
    }

    public static Show(Form mdiParent)
    {
        if ( Instance == null )
        {
            // Create new form, assign it to Instance
        }
        else
            Instance.Activate(); // Not sure about this line, find the appropriate equivalent yourself.
    }

    protected override OnFormClose(EventArgs e)
    {
        Instance = null;
        base.OnFormClose(e);
    }
}

Если безопасность потоков вызывает беспокойство, добавьте соответствующую блокировку s.

3
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: