Можно ли перегрузить метод 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;
}