Можно ли перегрузить метод ShowDialog для форм и вернуть другой результат? - PullRequest
11 голосов
/ 22 сентября 2010

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

РЕДАКТИРОВАТЬ: есть «base.ShowDialog ()», и это работает. Это мойновый вопрос здесь:

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

Спасибо.

Ответы [ 4 ]

12 голосов
/ 22 сентября 2010

Редактировать: Скорее всего, не стоит менять функциональность 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();
4 голосов
/ 22 октября 2012

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

 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();
        }
    }
1 голос
/ 22 сентября 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
}
0 голосов
/ 22 сентября 2010

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

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