Существует ли стандартный способ возврата значений из пользовательских диалоговых окон в Windows Forms?
-
09-06-2019 - |
Вопрос
Итак, прямо сейчас в моем проекте есть несколько пользовательских диалоговых окон, которые делают такие вещи, как запрос пользователю о его дне рождения или что-то еще.Прямо сейчас они просто делают такие вещи, как установка this.Birthday
свойство, как только они получат ответ (который имеет тип DateTime?
, с нулевым значением, указывающим на "Отмену").Затем вызывающий проверяет Birthday
свойство диалогового окна, которое он создал, чтобы выяснить, что ответил пользователь.
Мой вопрос заключается в следующем, есть ли более стандартный шаблон для выполнения подобных вещей? Я знаю, что мы можем установить this.DialogResult
что касается основных элементов OK / Cancel, но есть ли в Windows Forms более общий способ указать в форме "вот данные, которые я собрал"?
Решение
Я бы сказал, что показ свойств в вашем настраиваемом диалоге - это идиоматический путь, потому что так поступают стандартные диалоги (например, Select / OpenFileDialog). Кто-то может возразить, что более явным и намеренным показом является наличие метода ShowBirthdayDialog (), который возвращает искомый результат, но следование шаблону фреймворка - это, вероятно, разумный путь.
Другие советы
есть ли более стандартный шаблон для таких вещей?
Нет, похоже, вы используете правильный подход.
Если диалоговое окно возвращает DialogResult.OK, предположим, что все необходимые свойства в диалоговом окне действительны.
Для меня лучше придерживаться Диалогового окна, возвращающего стандартные ответы диалогового окна, а затем получать доступ к результатам через свойства.
С того места, где я сижу, есть две веские причины:
- Согласованность - вы всегда делаете одно и то же с диалогом, и сама природа вопроса предполагает, что шаблоны хороши (-:Хотя в равной степени возникает вопрос, является ли это хорошим шаблоном?
- Это позволяет возвращать несколько значений из диалогового окна - хорошо, здесь тоже есть совершенно новое обсуждение, но прикладной прагматизм означает, что это то, что нужно, в некоторых обстоятельствах не всегда уместно или желательно упаковывать значения просто так, чтобы вы могли передать их обратно всем за один раз.
Поток логики тоже хорош:
if (Dialog == Ok)
{
// Do Stuff with the entered values
}
else
{
// Respond appropriately to the user cancelling the dialog
}
Это хороший вопрос - мы должны задавать вопросы о подобных вещах, - но для меня текущая схема является достойной.
Мерф
В модальных диалоговых окнах ввода я обычно перегружаю ShowDialog и передаю параметры для нужных мне данных.
DialogResult ShowDialog(out datetime birthday)
Обычно я нахожу, что легче обнаружить и понять, чем смешивать мои свойства со 100+, которые предоставляет класс Form.
Для форм у меня обычно есть контроллер и интерфейс IView, который использует свойства только для чтения для передачи данных.
Я всегда делал это именно так, как вы описываете. Мне любопытно посмотреть, есть ли более приемлемый подход.