Использование 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()
или поместите свою форму в блоке использования.