2011-04-25 10 views
1

ShowDialogで得られる伝統的なOKまたはCancel状態、つまりカスタムダイアログフォームのテキストボックスからの文字列よりも多くの情報が必要です。DialogResultより多くの情報を含むカスタムShowDialog

私は論理が何であるのだろうか。

CustomDialog d = new CustomDialog(); 
DoStuffWith(d.ShowDialog().CustomString); 

もちろん、戻り値のカスタムクラスが必要です。さんはこのようにそれを定義してみましょう:フォーム:

class CustomDialogResult 
{ 
    public string CustomString { get; private set; } 

    public CustomDialogResult(string customString) 
    { 
     this.CustomString = customString; 
    } 
} 

はその後、我々は我々のCustomDialogでShowDialogメソッドをnewverrideする必要があると思います。私は、フォームのペアレント表示から始めることができると推測しています。また、イベントハンドラを[OK]ボタンに追加すると、結果が設定されます。

public CustomDialogResult CustomDialogResult { get; private set; } 

private void buttonOK_Click(object sender, EventArgs e) 
{ 
    this.Result = new CustomDialogResult(this.TextBoxCustom.Text); 
    this.Close(); 
} 

public CustomDialogResult ShowCustomDialog() 
{ 
    this.Show(Form.ActiveForm); 
} 

ご覧のとおり、問題は[OK]ボタンがクリックされるのを待ってから、これを返すことになります。私は、Thread.Sleep(0)またはManualResetEventを使用することができますが、それはダイアログフォームの入力をブロックします。私はこのことについてどうやって行くのですか?私は醜い構文を使うことができることを知っていますが、ShowDialogがうまくいけば、できることがあります。 :)

答えて

3

OpenFileDialogとします。

標準的なOK結果を使用して、追加情報をプロパティとメソッドで単純に公開します。

これを自分で行うには、OkボタンのDialogResultをDialogResult.OKに設定するだけで済みます。そうすれば、呼び出しフォームはプロパティまたはメソッドを使って余分な情報を問い合わせます。

だから、呼び出し元のコードは、この

CustomDialog d = new CustomDialog(); 

    if(d.ShowDialog() == DialogResult.OK) 
    { 
     CustomDialogResult foo = d.CustomDialogResult; 
     DoStuff(foo.CustomString); 
    } 
+0

D'オハイオ州のように見えます!とても簡単。確かにこれを行うでしょう。ありがとう。 – Lazlo

2

への呼び出しは、ShowCustomDialog()メソッドでラップすることができます。そうすれば、すべての "魔法"を無料で手に入れることができます。

関連する問題