フォームにShowDialogメソッドを過負荷にして、別の結果を返すことは可能ですか?
-
04-10-2019 - |
質問
編集:この方法は実際にはうまく機能し、後で解決策を見つけました。オーバーロードされたshowdialog()メソッドに正しい呼び出しを追加しました(それは断言的に過負荷、またはオーバーライドでさえありませんが、同じように機能します。私の新しい質問は下部のものです。
3つのボタンのいずれかをクリックするフォームがあります。返された結果の列挙を定義しました。電話をかけたい:
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()」があり、機能します。これは私の新しい質問です:
また、これはこれをすべて行うための最良の方法であり、なぜですか?
ありがとう。
解決
編集:の機能を変更するのは良い考えではありません 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
メソッドをオーバーライデンにすることはできません。 inteadができることは、ShowDialogの結果と別の値の両方を返す新しい方法を作成することです。
public ShowDialogResult ShowDialogWrappe(out MyFormResults result) {
var dialogRet = ShowDialog();
result = MyFormResults.Result1;
return dialogRet;
}