2011-04-25 23 views
1

我需要一些比ShowDialog獲得的傳統OK或Cancel狀態更多的信息,也就是我的自定義對話框窗體上的文本框中的一些字符串。自定義ShowDialog與DialogResult相比具有更多信息

我想知道這是什麼邏輯。我想這樣稱呼它:

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

當然,必須有返回結果的自定義類。讓我們這樣定義它:

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

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

然後,我們需要在我們的CustomDialog:Form中重新使用ShowDialog方法。我猜想我們可以從表單的一些父顯示開始。此外,將一個事件處理程序添加到確定按鈕,這將設置結果。

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按鈕被點擊,然後返回this.Result。我可以使用Thread.Sleep(0)或ManualResetEvent,但會阻止對話框窗體上的輸入。我將如何去做這件事?我知道我可以使用醜陋的語法,但是如果ShowDialog很好地完成它,我們必須有辦法。 :)

回答

3

考慮OpenFileDialog

它使用標準的OK結果,並通過屬性和方法簡單地公開額外的信息。

要自己做到這一點,您只需要將Ok Button的DialogResult設置爲DialogResult.OK,然後調用表單將通過屬性或方法詢問您的額外信息。

所以調用代碼看起來像這樣

CustomDialog d = new CustomDialog(); 

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

D'哦!太簡單。現在肯定會這樣做。謝謝。 – Lazlo 2011-04-25 03:13:06

2

您可以在ShowCustomDialog()方法中打包呼叫ShowDialog()。這樣,你可以免費獲得所有的「魔術」。

相關問題