Модальное диалоговое окно Windows Forms, которое возвращает объект, а не DialogResult
-
04-07-2019 - |
Вопрос
Я вроде как застрял с этим, поэтому я надеялся, что кто-нибудь сможет мне помочь.
Я делаю приложение Winforms и мне нужно показать модальное диалоговое окно (form.ShowDialog), которое возвращает значение (запрашивает у пользователя некоторые значения и упаковывает их в объект). Р>
Я просто не вижу, как это сделать, вместо того, чтобы давать ссылку на объект или в зависимости от какой-либо формы публичного свойства, чтобы потом прочитать данные. Р>
Я бы хотел, чтобы ShowDialog возвращал что-то другое, но это не работает. Это какой-то "хороший" способ сделать это? Р>
Я уверен, что проблема не нова, но так как почти никто больше не делает Winforms, я не могу найти никакого руководства в Интернете.
Решение
Добавьте статический метод в форму, например:
public class MyDialog : Form
{
// todo: think of a better method name :)
public static MyObject ShowAndReturnObject()
{
var dlg = new MyDialog();
if (new dlg.ShowDialog() == DialogResult.OK)
{
var obj = // construct an instance of MyObject from dlg
return obj;
}
else
{
return null;
}
}
}
Теперь вы можете вызывать это из своей программы следующим образом:
var myObject = MyDialog.ShowAndReturnObject();
... и если они отменят диалог, myObject будет нулевым.
Теперь, сказав все это, я считаю, что добавление свойства в класс вашей формы, из которого вы затем читаете после вызова ShowDialog (), является лучшим подходом.
Другие советы
Вы можете создать открытое свойство в диалоге, которое представляет возвращаемое значение:
/* Caller Code */
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
MessageBox.Show(dlg.MyResult);
/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }
private void btnOk_Click(object sender, EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
Или вы можете создать новый метод ShowDialog внутри вашего класса форм, который в основном делает то, что делает Мэтт Гамильтон. Может быть, даже метод расширения, если это то, что вы делаете для множества форм в вашей проблеме.
Открытое свойство в диалоговой форме имеет смысл. Однако не закрывайте диалоговое окно в обработчике события нажатия кнопки «ОК». При назначении свойства DialogResult диалоговая форма будет скрыта. Затем в форме вызова можно определить, были ли нажаты кнопки «ОК» или «Отмена», изучив DialogResult. Затем вы можете получить доступ к общедоступному свойству, если была нажата кнопка «ОК», и затем удалить диалоговую форму. Это должно быть сделано с помощью блока try-catch-finally в форме вызова или с помощью оператора using. Вы должны избавиться от модального диалога, чтобы предотвратить утечку памяти.