嗨我有一個窗體(窗體A),它有一個按鈕「添加」,彈出一個文本輸入窗體(窗體B)。在表格B中輸入文本後,按「確定」(btnOK)。在這一點上,我希望表單A獲得文本並對其進行處理。回調的概念(C#)
從我看到我有兩個選項:
1)形式A傳遞函數(代表),以形成B,其執行它在btnOK_Click功能。
2)我以某種方式在b窗體中使用btnOK.Click事件註冊一個方法。
我是正確的軌道上,你可以認爲我能讀,因爲我與靜態方法和事件麻煩了類似的問題,任何解決方案...
嗨我有一個窗體(窗體A),它有一個按鈕「添加」,彈出一個文本輸入窗體(窗體B)。在表格B中輸入文本後,按「確定」(btnOK)。在這一點上,我希望表單A獲得文本並對其進行處理。回調的概念(C#)
從我看到我有兩個選項:
1)形式A傳遞函數(代表),以形成B,其執行它在btnOK_Click功能。
2)我以某種方式在b窗體中使用btnOK.Click事件註冊一個方法。
我是正確的軌道上,你可以認爲我能讀,因爲我與靜態方法和事件麻煩了類似的問題,任何解決方案...
如果表格B是一個模式窗口,您可以將公共字符串屬性添加到表格B.
當用戶關閉表格B時,您可以將該屬性設置爲用戶輸入的文本。然後,返回表格A,您可以閱讀表格B的公共屬性以獲取用戶輸入的文本。
一個更好的解決方案是在Form B上放置一個包含你需要的文本的公共財產。然後,在表單B退出後,從表單A訪問該屬性。
添加屬性窗體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 - 傳遞一個委託是乾淨和簡單
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();
}
您也可以創建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彈出窗口。
是這樣嗎?http://stackoverflow.com/questions/818785/return-values-from-dialog-box – TrymBeast