Можно ли перегружать метод ShowDialog для форм и вернуть другой результат?
-
04-10-2019 - |
Вопрос
Редактировать: Этот метод на самом деле работает отлично, и я спросил его, затем нашел решение позже. Я добавил правильный вызов в перегруженном методе 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;
}