Как прервать конструктор оконной формы? - PullRequest
0 голосов
/ 26 августа 2010

У меня есть простое приложение:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

Конструктор Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // ...

        if (some_condition)
        {
            DialogResult dr = MessageBox.Show("Do you want to continue ?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error);

            if (dr == DialogResult.No)
            {
                // How to close the window normally or how to not create a Form1 instance ?
                //
                //
            }
        }

        // amount of code that executes only if some_condtion == false
    }
}

Я знаю, что могу проверить some_condition перед Application.Run, но это трудно изменить (поверьте мне). Мне нужно проверить some_condition в конструкторе Form1. Если some_condition == true и ответ отрицательный -> приложение закрывается.

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Цель конструктора - создать экземпляр объекта. Следовательно, он не должен потерпеть неудачу, если не произойдет сбой некоторой предпосылки объекта. В этом конкретном случае ваш единственный вариант - выдать исключение.

Другими словами: вы вызываете конструктор объекта, чтобы создать экземпляр этого объекта, так что это атомарная функция, которая не должна завершиться ошибкой, если у вас нет технической проблемы.

Теперь вам нужно избегать отображения формы при некоторых условиях. Есть несколько способов сделать это. Сначала давайте посмотрим на код:

Application.Run(new Form1());

Этот фрагмент выполняет две вещи: создает экземпляр Form1 и отображает его (передавая Application.Run). Итак, один из вариантов:

// snippet at program.cs
Form1 mainForm = new Form1();
if (mainForm.IsValid)
{
     Application.Run(new Form1());        
}

// snippet at Form1.cs
public bool IsValid
{
    get 
    {
        // evaluate all conditions that should determine if the form is to be showed.
        return condition;   
    }
}

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

Этот метод / свойство (в моем коде называемое «IsValid») отвечает за проверку возможности отображения формы в это время.

Не забудьте отделить логику от представления в вашей программе.

Это сделало бы это.

1 голос
/ 26 августа 2010

Это будет проще сделать в событии загрузки формы.Вы можете просто позвонить Close ().

Вызов Close () в конструкторе вызовет проблемы, потому что окно еще не открыто.В итоге вы получите окно, которое все еще пытается открыть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...