2011-08-26 116 views
1

嗨我有一個窗體(窗體A),它有一個按鈕「添加」,彈出一個文本輸入窗體(窗體B)。在表格B中輸入文本後,按「確定」(btnOK)。在這一點上,我希望表單A獲得文本並對其進行處理。回調的概念(C#)

從我看到我有兩個選項:

1)形式A傳遞函數(代表),以形成B,其執行它在btnOK_Click功能。

2)我以某種方式在b窗體中使用btnOK.Click事件註冊一個方法。

我是正確的軌道上,你可以認爲我能讀,因爲我與靜態方法和事件麻煩了類似的問題,任何解決方案...

+0

是這樣嗎?http://stackoverflow.com/questions/818785/return-values-from-dialog-box – TrymBeast

回答

6

如果表格B是一個模式窗口,您可以將公共字符串屬性添加到表格B.

當用戶關閉表格B時,您可以將該屬性設置爲用戶輸入的文本。然後,返回表格A,您可以閱讀表格B的公共屬性以獲取用戶輸入的文本。

2

一個更好的解決方案是在Form B上放置一個包含你需要的文本的公共財產。然後,在表單B退出後,從表單A訪問該屬性。

4

添加屬性窗體B,這就是說,

public class FormB { ... 
    public string Text 
    { 
     get { return textBox.Text; } 
    } 
    ... 
} 

如果您展現形式b類似如下:

FormB b = new FormB(); 
WPF: if (b.ShowDialog() != true) return; 
Winforms: if (b.ShowDialog(this) != DialogResult.Ok) return; 

string txt = b.Text; 

所以基本上所發生的事情是你是顯示模式窗體B,用戶可以在其中輸入文字。一旦窗體關閉,b.ShowDialog將從阻塞返回。此時,您可以請求b的Text屬性並檢索字符串。 Text屬性應該使用某種方法綁定到b的文本框。

如果您不希望顯示b模態,你可以這樣做:

FormB b = new FormB(); 
b.Closed += new EventHandler(FormB_Closed); 

b.Show(); 

private void FormB_Closed(object sender, EventArgs e) 
{ 
    string text = ((FormB)sender).Text; 

    ... do something 
} 
1

我更喜歡#1 - 傳遞一個委託是乾淨和簡單

class BInputValues { 
    public String Field1 { get; set; } 
    //... 
}; 

partial class FormB { 
    readonly Action<BInputValues> callback; 

    public FormB(Action<BInputValues> callback) { 
     this.callback = callback; 
    } 

    protected override void btnOK_Click(object sender, EventArgs e) { 
     callback(new BInputValues { 
      Field1 = Field1.Text, 
      //... 
     }); 
    } 
} 

override void btnAdd_click() { 
    var formb = new FormB(args => { 
     // do something with args 
    }); 
    formb.ShowModal(); 
} 
1

您也可以創建Form的子類...

public class FormWithResult : Form 
{ 
    protected object FormResult { get; set; } 

    public DialogResult ShowDialog(out object result) 
    { 
     DialogResult dr = ShowDialog(); 
     result = FormResult; 
     return dr; 
    } 

    public DialogResult ShowDialog(out object result, IWin32Window win) 
    { 
     DialogResult dr = ShowDialog(win); 
     result = FormResult; 
     return dr; 
    } 

    public void Return(object result) 
    { 
     FormResult = result; 
     Close(); 
    } 

} 

然後,你可以這樣寫調用模式窗體並檢索結果

 popup p = new popup(); 
     object result; 
     p.ShowDialog(out result); 
     MessageBox.Show((string)result); 

而在你彈出的形式,你既可以做:

 FormResult = textBox1.Text; 
     Close(); 

OR

 Return(textBox1.Text); 

關閉表單並返回值。

子類表單也有缺陷,當然,但我會把它作爲另一個解決方案。

作爲邊沒有,這個仿製藥在那裏你可以強類型的返回值會更好,如果不是因爲這個限制在設計時:Visual Studio 2008 Winform designer fails to load Form which inherits from generic class

如果你想異步顯然這導致將不得不進行調整。我假設你正在使用Modal彈出窗口。