До сих пор для получения результата работы диалогового окна мы использовали стандартные возможности. Например, для кнопки OK мы просто установили свойство DialogResult в OK, и теперь кнопка сама закрывает диалоговое окно и возвращает нужное значение родительскому окну. При этом мы не написали ни строчки кода.
А что, если нам нужно закрыть окно и вернуть результат OK по какому-то другому событию, где нет возможности так просто взять и установить магическое свойство DialogResult? Например, если мы хотим сохранять значение по щелчку на ссылке компонента LinkLabel, то нужно создать обработчик события LinkClicked для этого компонента и написать в нем строку:
DialogResult = DialogResult.OK;
Здесь мы присваиваем свойству DialogResult значение DialogResult.OK. Это присваивание заставляет форму закрыться и вернуть значение, которое мы присвоили. Именно это и происходит по нажатию кнопки, если ее свойство DialogResult установлено в какое-то значение, отличное от None.
А что, если нам нужно создать собственный, специфичный именно для нас результат, и его просто нет среди готовых значений DialogResult? Мы можем запрограммировать все самостоятельно. Допустим, что мы пишем код копирования фай- лов. Что делать, если файл в месте приемника уже существует? Логично было бы запросить у пользователя, что он хочет сделать. Давайте создадим такое диалоговое окно запроса. Мою форму можно увидеть на рис. 11.4, а ее код приведен в лис- тинге 11.5.
Рис. 11.4. Форма запроса пользователя о действии
Листинг 11.5. Код формы запроса пользовательского действия
public partial class ActionRequestForm : Form { // перечисление результата public enum FileAction { Owerrite, Rename, Skip, OverriteOlder, OverriteAll, SkipAll, Cancel } // свойство результата public FileAction Result { get; set; } // конструктор public ActionRequestForm() { InitializeComponent(); Result = FileAction.Cancel; } // обработчик нажатия кнопки Перезаписать private void overriteButton_Click(object sender, EventArgs e) { Result = FileAction.Owerrite; Close(); } // обработчик нажатия кнопки Переименовать private void renameButton_Click(object sender, EventArgs e) { Result = FileAction.Rename; Close(); } // остальные обработчики событий ... }
Самое первое, что я объявляю в форме, — это перечисление enum с именем FileAction, которое определяет значения результата. Потом идет свойство с именем Result типа FileAction. Это свойство будет хранить результат. Мы не станем задействовать стандартное свойство DialogResult — вместо него воспользуемся свойством Result.
В конструкторе переменной Result присваивается значение по умолчанию FileAction.Cancel, которое будет использовано, если пользователь не выберет ни одну из кнопок, созданных мной, а нажмет крестик в заголовке окна.
После этого идут обработчики события для кнопок формы. Каждая из кнопок имеет вид:
private void overriteButton_Click(object sender, EventArgs e) { Result = FileAction.Действие; Close(); }
Сначала изменяется свойство Result, и тут же закрывается форма.
Эту форму можно использовать примерно так:
ActionRequestForm form = new ActionRequestForm(); form.ShowDialog(); MessageBox.Show(form.Result.ToString());
Как всегда — создаем окно и отображаем его с помощью метода ShowDialog(), и только после отображения окна работаем с созданным нами свойством Result.