フォームにShowDialogメソッドを過負荷にして、別の結果を返すことは可能ですか?

StackOverflow https://stackoverflow.com/questions/3764736

質問

編集:この方法は実際にはうまく機能し、後で解決策を見つけました。オーバーロードされた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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top