Пользовательский ShowDialog с большей информацией, чем DialogResult

#c# #.net #forms #showdialog

#c# #.net #формы #showdialog

Вопрос:

Мне нужно немного больше информации, чем традиционные состояния OK или Cancel, которые вы получаете с помощью ShowDialog, то есть некоторые строки из текстовых полей в моей пользовательской диалоговой форме.

Интересно, какова логика. Я бы хотел назвать это так:

 CustomDialog d = new CustomDialog();
DoStuffWith(d.ShowDialog().CustomString);
  

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

 class CustomDialogResult
{
    public string CustomString { get; private set; }

    public CustomDialogResult(string customString)
    {
        this.CustomString = customString;
    }
}
  

Тогда нам нужно было бы переопределить метод ShowDialog в нашем CustomDialog : Form. Я предполагаю, что мы могли бы начать с некоторого родительского отображения формы. Кроме того, добавьте обработчик события к кнопке OK, который задал бы результат.

 public CustomDialogResult CustomDialogResult { get; private set; }

private void buttonOK_Click(object sender, EventArgs e)
{
    this.Result = new CustomDialogResult(this.TextBoxCustom.Text);
    this.Close();
}

public CustomDialogResult ShowCustomDialog()
{
    this.Show(Form.ActiveForm);
}
  

Как вы можете видеть, проблема заключается в ожидании нажатия кнопки OK, чтобы затем вернуть это.Результат. Я мог бы использовать Thread.Режим ожидания (0) или ManualResetEvent, но это заблокировало бы ввод в диалоговой форме. Как бы я поступил с этим? Я знаю, что мог бы использовать более уродливый синтаксис, но если ShowDialog делает это красиво, должен быть способ, которым мы можем. 🙂

Ответ №1:

Рассмотрим OpenFileDialog.

Он использует стандартный результат OK и просто предоставляет дополнительную информацию через свойства и методы.

Чтобы сделать это самостоятельно, вам просто нужно установить для DialogResult вашей кнопки Ok значение DialogResult.ХОРОШО, и тогда ваша вызывающая форма запросит вашу дополнительную информацию с помощью свойства или метода.

Итак, вызывающий код выглядит следующим образом

   CustomDialog d = new CustomDialog();

  if(d.ShowDialog() == DialogResult.OK)
  { 
      CustomDialogResult foo = d.CustomDialogResu<
      DoStuff(foo.CustomString); 
  }
  

Комментарии:

1. О! Так просто. Уверен, что сделаю это сейчас. Спасибо.

Ответ №2:

Вы могли бы просто обернуть вызов в ShowDialog() свой ShowCustomDialog() метод. Таким образом, вы получаете всю его «магию» бесплатно.