我預計的期望是:
在「視窗A」點按鈕(Button) → 彈出「視窗B」→ 將「視窗B」更改後的數值回傳
在「視窗A」點按鈕(Button) → 彈出「視窗B」→ 將「視窗B」更改後的數值回傳
由於「視窗B」的設定不是只有一項,要回傳的話一定是陣列(Array)或集合(Collections)
好處是彼此的變數並不直接干涉,不用因為改了變數名,另一個也要跟著改。
※我用的是WPF,會跟WinForm有一點差距,但是概念差不多。偏基礎的部分,下面介紹就省略了,畢竟需要跨視窗還很在意修飾詞(public, private...)的人,看廢話也覺得煩吧。
視窗A - MainWindow |
private Dictionary<string, string> SetDic = new Dictionary<string, string>();
private void Button_Click(object sender, RoutedEventArgs e)
{
SettingWindow sw = new SettingWindow(SetDic);
if (sw.ShowDialog() == true) //從設定中取值
SetDic=sw.ApplySetting();
}
視窗A的程式碼主要是
第一列:建立Dictionary的集合「SetDic」,作為接收與後續利用
第四列:在事件中用實做視窗B「SettingWindow」,視窗B的建構式看下面
第五、六列:如果在視窗B有點「確定」之類的,那就會執行「SettingWindow」中寫好的方法,將回傳的集合賦值給「SetDic」
視窗B - SettingWindow |
public partial class SettingWindow
{
private Dictionary<string, string> _SetDic;
public SettingWindow(Dictionary<string, string> _SetDic)
{
//(不重要,中略)
_SetDic=SetDic;
}
private void Apply_Click(object sender, RoutedEventArgs e)
{
//(不重要,中略)
this.DialogResult = true;
this.Close();
}
internal Dictionary<string, string> ApplySetting() {
//(不重要,中略)
return _SetDic;
}
}
視窗B就是重頭戲了,分成
第一列:可以看到這個視窗的類別名稱是「SettingWIndow」
第三列:建立一個用來暫存從視窗A丟過來的集合「_SetDic」
第四~八列:由於要接視窗A丟過來的「SetDic」,所以在寫建構式時,要定義參數型別。然後在將接到「SetDic」賦予給「_SetDic」
第九~十四列:這個是點「確定」時,會觸發的事件。重點在第十三列與第十四列的「this.DialogResult = true; this.Close();」,功能分別是「要讓視窗A第五列的IF判斷能成功觸發、關閉視窗B」
第十五~十八列:寫一個會回傳數值的方法,把在視窗B變更過的「_SetDic」回頭賦予給「SetDic」
沒有留言:
張貼留言