2010-09-21 1 views
11

EDIT: Этот метод действительно отлично работает, и я спросил его, затем нашел решение позже. Я добавил правильный вызов в перегруженном методе 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(), поэтому как мне это сделать?

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

Также, это лучший способ сделать все это и почему?

Спасибо.

+0

ОК, довольно смущенный, но есть «база».ShowDialog() ", и он отлично работает. Я пытался« this.base.ShowDialog() ». Это работает отлично. –

ответ

10

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

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

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

Нет, его невозможно. Обычным решением является выставить свой реальный результат в виде собственности на Форме:

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 
} 
3

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

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