12

編集:この方法は実際にうまく機能し、後で解決策を見つけた. オーバーロードされた 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()」があり、機能します。これは私の新しい質問です:

また、これはすべてを行うための最良の方法ですか?なぜですか?

ありがとう。

4

4 に答える 4

13

編集: の機能を変更することはおそらく良い考えではありませんShowDialog()。人々はそれが a を返し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();
于 2010-09-21T21:49:39.757 に答える
5

これを試してください、それは私のために働くようです:

 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();
        }
    }
于 2012-10-22T08:59:24.217 に答える
1

メソッドはShowDialogオーバーライドできません。ただし、代わりにできることは、ShowDialog の結果と別の値の両方を返す新しいメソッドを作成することです。

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
于 2010-09-21T21:49:40.983 に答える
1

いいえ、できません。通常の回避策は、実際の結果をフォームのプロパティとして公開することです。

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
}
于 2010-09-21T21:51:16.363 に答える