Подтвердить что ты не робот

Правильное использование DialogResult

В ответе на недавний вопрос, который у меня был (здесь), Ханс Пассант заявил, что я должен установить DialogResult для закрытия моих форм вместо form.Close() хотя я не могу понять, почему?

Если я правильно прочитал, в документации MSDN указано, что это просто скроет форму, а не будет правильно утилизировать ее, что я считаю .Close()?

Извлечь из документации.

Метод Close не вызывается автоматически, когда пользователь нажимает кнопку "Закрыть" диалогового окна или задает значение свойства DialogResult. Вместо этого форма скрыта и может быть показана снова без создания нового экземпляра диалогового окна. Из-за этого поведения вы должны вызвать метод Dispose формы, когда форма больше не нужна вашему приложению.

С другой стороны, Microsoft создала страницу поддержки , в которой говорится, как использовать свойство DialogResult и в разделе "Проверить его работу" из этого говорится, что нажатие так закрывает форму.

Итак, мой вопрос в два раза, я должен продолжать использовать Close или DialogResult; и результат диалога закрывает или скрывает форму. Из кода, который я сделал ниже (простая форма с двумя кнопками), казалось бы, что он действительно скрыт только тогда, когда точка останова на this.Close() попадает... (с комментарием this.Close(), форма все еще исчезает, просто не уверен скрытые или нет)

    public Form1()
    {
        InitializeComponent();
        button1.Click += (s, e) =>
            {
                 //I edited my question to include using
                using(Form1 form = new Form1())
                {
                    form.ShowDialog();
                }

            };
        button2.Click += (s, e) => 
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            };
    }
4b9b3361

Ответ 1

Когда вы открываете модальный диалог с ShowDialog, вызывающий код блокируется до тех пор, пока форма не будет закрыта или скрыта. Если вы хотите прочитать некоторые общедоступные свойства вызываемой формы и хотите что-то сделать (например, сохранить данные в базе данных или в файл) на основе щелчка на кнопке "ОК" или "Отмена", вам необходимо знать, хочет ли пользователь совершить действие или нет. Функция DialogResult, возвращаемая методом ShowDialog(), позволяет выполнить соответствующие действия...

Итак, например

using (Form1 form = new Form1())
{
    DialogResult dr = form.ShowDialog();
    if(dr == DialogResult.OK)
    {
        string custName = form.CustomerName;
        SaveToFile(custName);
    }

}

Ответ 2

Вызываете ли вы Close или устанавливаете свойство DialogResult, это не проблема. Вам просто нужно позвонить Dispose. Я предпочитаю делать это с использованием блока:

using (Form1 form = new Form1())
{
    form.ShowDialog();
}

Я изначально думал, что вы можете называть ShowDialog на Form, который уже вызвал метод Close. Это не тот случай. Если вы покажете форму с помощью ShowDialog, то, похоже, она не закрыта в результате метода Close или не устанавливает свойство DialogResult. Казалось бы, установка DialogResult является просто сокращением для закрытия Form.

Но вызываете ли вы Close или устанавливаете свойство DialogResult, чтобы убедиться, что вы вызываете Dispose() или помещаете свою форму в используемый блок.