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

StackOverflow https://stackoverflow.com/questions/3764736

Вопрос

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

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

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() Функция, так как мне это сделать?

Редактировать: есть «база. Showdialog ()», и он работает. Это мой новый вопрос здесь:

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

Спасибо.

Это было полезно?

Решение

Редактировать: вероятно, не хорошая идея, чтобы изменить функциональность 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();

Другие советы

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

 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();
        }
    }

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

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
}

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

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top