2008-10-27 68 views
5

我有點卡住了這個,所以我希望有人能幫助我。Windows窗體模態對話框返回一個對象而不是DialogResult

我在做一個Winforms應用程序,我需要顯示一個模態對話框(form.ShowDialog),它返回一個值(提示用戶某些值並將它們包裝在對象中)。

我只是不能看到如何做到這一點,而不是給對象的引用或取決於某些形式的公共屬性以後讀取數據。

我只想讓ShowDialog返回一些不同的東西,但這不起作用。 是否有一些「好」的方法來做到這一點?

我敢肯定,這個問題並不新鮮,但因爲幾乎沒有人會做Winforms,所以我在網上找不到任何指導。

回答

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的將爲空。

現在,說了這麼多,我確實認爲向表單的類添加一個屬性,然後在調用ShowDialog()之後讀取該屬性是更好的方法。

+0

Dammit :)這幾乎就是我所擁有的(除了我調用我的方法ShowDialog - 爲什麼不呢?)。 – 2008-10-27 09:50:16

0

或者您可以在您的表單類中創建一個新的ShowDialog方法,該方法基本上完成了Matt Hamilton的工作。如果這是你在問題中做了很多形式的事情,甚至可能是擴展方法。

2

可以代表返回值對話框中創建一個公共屬性:

/* 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(); 
} 
0

在對話框形式的公共財產是有道理的。但是,請勿在Ok按鈕單擊事件處理程序中關閉對話框。當您分配DialogResult屬性時,對話框窗體將被隱藏。然後在調用表單中,您可以通過檢查DialogResult來確定是否單擊了Ok或Cancel。然後,如果單擊確定按鈕,然後處理對話框表單,則可以訪問公共屬性。這應該使用調用表單中的try-catch-finally塊或using語句完成。您必須處理模式對話框以防止內存泄漏。

相關問題