Можно ли перегрузить метод ShowDialog для форм и вернуть другой результат?

EDIT: этот метод действительно отлично работает, и я спросил его, затем нашел решение позже. Я добавил правильный вызов в перегруженном методе ShowDialog() (он не слишком перегружен или даже переопределен, но он работает точно так же. Мой новый вопрос - тот, который внизу.

У меня есть форма, в которой вы нажимаете одну из трех кнопок. Я определил перечисление для возвращаемых результатов. Я хочу позвонить:

MyFormResults res = MyForm.ShowDialog();

Я могу добавить новый метод ShowDialog с помощью этого кода:

public new MyFormResults ShowDialog()
{
    //Show modal dialog
    base.ShowDialog(); //This works and somehow I missed this

    return  myResult; //Form level variable (read on)
}

Я устанавливаю переменную уровня формы для результата при нажатии кнопок:

MyFormResults myResult;

private void btn1_click(object sender, EventArgs e)
{
    myResult = MyFormsResults.Result1;
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}

//Same as above for the other results

Единственное, что мне не хватает, это код, чтобы показать диалог (модальный), а затем вернуть мой результат. Нет функции base.ShowDialog(), поэтому как это сделать?

EDIT: существует "base.ShowDialog()", и он работает. Это мой новый вопрос:

Кроме того, это лучший способ сделать все это и почему?

Спасибо.

Ответ 1

Изменить: Это не очень хорошая идея изменить функциональность ShowDialog(), люди ожидают, что она вернет DialogResult и покажет форму, я предлагаю что-то вроде моего предложения ниже. Таким образом, все еще позволяя ShowDialog() использоваться обычным образом.

Вы можете создать статический метод на MyForm, что-то вроде DoShowGetResult()

который будет выглядеть примерно так.

public static MyResultsForm DoShowGetResult()
{
   var f = new MyForm();
   if(f.ShowDialog() == DialogResult.OK)
   {
      return f.Result;   // public property on your form of the result selected
   }
   return null;
}

то вы можете использовать этот

MyFormsResult result = MyForm.DoShowGetResult();

Ответ 2

Попробуй, мне кажется, это работает для меня:

 public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public DialogResult ShowDialog(string mes)
        {
            this.textBox1.Text = mes;
            return base.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

Ответ 3

Нет, это невозможно. Обычным обходным путем является раскрытие вашего реального результата как свойства в форме:

pubic MyFormResults MyResult
{
  get;
}

и вы установили бы это:

private void btn1_click(object sender, EventArgs e)
{
    MyResult = MyFormsResults.Result1;
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}

и вызывающий код обычно выглядит так:

if (form.ShowDialog == DialogResult.OK)
{
  //do something with form.MyResult
}

Ответ 4

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

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}