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

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

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

5 ответов


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


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

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

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


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

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

  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)

Я обычно нахожу, что легче обнаружить и понять vs, смешивая мои свойства с 100+, которые предоставляет класс формы.

для форм у меня обычно есть контроллер и интерфейс IView, который использует свойства readonly для передачи данных.


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