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

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

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

Выписка из документации.

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

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

Так что мой вопрос в два раза, я должен продолжать использовать 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();
            };
    }

2 ответа

Решение

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

Так например

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

}

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

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

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

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

Другие вопросы по тегам