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

РЕДАКТИРОВАТЬ: этот метод действительно отлично работает, и я спросил его, а затем нашел решение позже. Я добавил правильный вызов в перегруженный метод 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()', и он работает. Это мой новый вопрос здесь:

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

Спасибо.


person Mike Webb    schedule 21.09.2010    source источник
comment
Хорошо, довольно смущен, но есть base.ShowDialog(), и он отлично работает. Я пробовал this.base.ShowDialog(). Это работает отлично.   -  person Mike Webb    schedule 22.09.2010


Ответы (4)


Редактировать: не рекомендуется изменять функциональность 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();
person PostMan    schedule 21.09.2010

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

 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();
        }
    }
person Snowpaque    schedule 22.10.2012

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

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

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

public 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
}
person Grzenio    schedule 21.09.2010