#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()
метод. Таким образом, вы получаете всю его «магию» бесплатно.