5

私はこれでちょっと立ち往生しているので、誰かが私を助けてくれることを願っています.

私は Winforms アプリケーションを実行しており、値を返すモーダル ダイアログ (form.ShowDialog) を表示する必要があります (ユーザーにいくつかの値を要求し、それらをオブジェクトにラップします)。

オブジェクトへの参照を与えるか、何らかの形式の public プロパティに依存して後でデータを読み取るのではなく、これを行う方法がわかりません。

ShowDialog が何か違うものを返すようにしたいのですが、うまくいきません。これを行うための「良い」方法はありますか?

問題は新しいものではないと確信していますが、ほとんど誰も Winforms を使用していないように見えるため、Web 上でガイダンスを見つけることができません。

4

4 に答える 4

12

次のように、静的メソッドをフォームに追加します。

public class MyDialog : Form
{
    // todo: think of a better method name :)
    public static MyObject ShowAndReturnObject() 
    {
        var dlg = new MyDialog();
        if (new dlg.ShowDialog() == DialogResult.OK) 
        {
            var obj = // construct an instance of MyObject from dlg
            return obj;
        }
        else
        {
           return null; 
        }
    }
}

これで、プログラムからこれを次のように呼び出すことができます。

var myObject = MyDialog.ShowAndReturnObject();

...そして、ダイアログをキャンセルすると、myObject は null になります。

さて、以上のことをすべて言ったので、フォームのクラスにプロパティを追加し、ShowDialog() を呼び出した後に読み取ることがより良い方法であると私は信じています。

于 2008-10-27T09:49:14.753 に答える
2

戻り値を表す Dialog 内にパブリック プロパティを作成できます。

/* Caller Code */   
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
  MessageBox.Show(dlg.MyResult);

/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }

private void btnOk_Click(object sender, EventArgs e)
{
  DialogResult = System.Windows.Forms.DialogResult.OK;
  this.Close();
}
于 2012-10-06T23:18:59.880 に答える
0

または、基本的にマット ハミルトンが行うことを行う新しい ShowDialog メソッドをフォーム クラス内に作成することもできます。問題の多くのフォームに対して行うものであれば、拡張メソッドでさえあるかもしれません。

于 2008-10-27T09:55:37.797 に答える