11.3. Специфичный результат

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

Предыдущая глава

11.2. Редактирование объектов

Следующая глава

11.4. Немодальные окна

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне