Существует ли стандартный способ возврата значений из пользовательских диалоговых окон в Windows Forms?

StackOverflow https://stackoverflow.com/questions/36984

  •  09-06-2019
  •  | 
  •  

Вопрос

Итак, прямо сейчас в моем проекте есть несколько пользовательских диалоговых окон, которые делают такие вещи, как запрос пользователю о его дне рождения или что-то еще.Прямо сейчас они просто делают такие вещи, как установка this.Birthday свойство, как только они получат ответ (который имеет тип DateTime?, с нулевым значением, указывающим на "Отмену").Затем вызывающий проверяет Birthday свойство диалогового окна, которое он создал, чтобы выяснить, что ответил пользователь.

Мой вопрос заключается в следующем, есть ли более стандартный шаблон для выполнения подобных вещей? Я знаю, что мы можем установить this.DialogResult что касается основных элементов OK / Cancel, но есть ли в Windows Forms более общий способ указать в форме "вот данные, которые я собрал"?

Это было полезно?

Решение

Я бы сказал, что показ свойств в вашем настраиваемом диалоге - это идиоматический путь, потому что так поступают стандартные диалоги (например, Select / OpenFileDialog). Кто-то может возразить, что более явным и намеренным показом является наличие метода ShowBirthdayDialog (), который возвращает искомый результат, но следование шаблону фреймворка - это, вероятно, разумный путь.

Другие советы

  

есть ли более стандартный шаблон для таких вещей?

Нет, похоже, вы используете правильный подход.

Если диалоговое окно возвращает DialogResult.OK, предположим, что все необходимые свойства в диалоговом окне действительны.

Для меня лучше придерживаться Диалогового окна, возвращающего стандартные ответы диалогового окна, а затем получать доступ к результатам через свойства.

С того места, где я сижу, есть две веские причины:

  1. Согласованность - вы всегда делаете одно и то же с диалогом, и сама природа вопроса предполагает, что шаблоны хороши (-:Хотя в равной степени возникает вопрос, является ли это хорошим шаблоном?
  2. Это позволяет возвращать несколько значений из диалогового окна - хорошо, здесь тоже есть совершенно новое обсуждение, но прикладной прагматизм означает, что это то, что нужно, в некоторых обстоятельствах не всегда уместно или желательно упаковывать значения просто так, чтобы вы могли передать их обратно всем за один раз.

Поток логики тоже хорош:

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, который использует свойства только для чтения для передачи данных.

Я всегда делал это именно так, как вы описываете. Мне любопытно посмотреть, есть ли более приемлемый подход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top