利用委托来进行窗口间的传值
以前如果碰到子窗体(ShowDialog显示)中的的改变会影响父窗体子控件内容时,要么就在ShowDialog()结束后更新数据,要么就把子控件设置为public。
1.ShowDialog方式:不能立马看到更新结果,ShowDialog会阻断当前线程,一定要等到子窗体关闭后,线程才被唤醒。
2.把控件设置了public 需要实例化父窗体,父窗体是一个大对象,虽然最终会被GC回收,GC也不知道什么时候才会把这个大对象销毁掉(书上说要等到内存不够用的时候),但始终会占用内存一段时间,影响性能不说,只为访问一个子控件而实例化一个大对象,得不偿失。
3.使用事件解决问题,既然当前主线程被锁定了,用户自己无法更新数据,这时候可以委托别人来做事(委托的好处),就像自己不能打官司一样,可以请律师来帮忙。顺便自己也可以复习一下事件与委托之间的关系:事件就是一个委托。
我们随便新建一个Winform项目,再新建两个窗体MainForm.cs,ChildForm.cs。再新建一个CallBack.cs类。
1 public delegate void ChangedHandler(string text); 2 3 public class Callback 4 { 5 public event ChangedHandler ChangedEvent; //声明改变窗口的事件 6 7 /// <summary> 8 /// 通过调用来触发事件 9 /// </summary> 10 /// <param name="text"></param> 11 public void ChangeText(string text) 12 { 13 if (ChangedEvent != null) 14 { 15 ChangedEvent(text); 16 } 17 } 18 }
1 public partial class MainForm : Form 2 { 3 public MainForm() 4 { 5 InitializeComponent(); 6 } 7 8 private void btn_Click(object sender, EventArgs e) 9 { 10 Callback callback = new Callback(); 11 12 callback.ChangedEvent+=new ChangedHandler(TextChanged); 13 ChildForm cForm = new ChildForm(callback); 14 cForm.ShowDialog(); 15 } 16 17 private new void TextChanged(string text) 18 { 19 txt.Text = text; 20 } 21 }
1 public partial class ChildForm : Form 2 { 3 public ChildForm() 4 { 5 InitializeComponent(); 6 } 7 8 private Callback callback; 9 10 public ChildForm(Callback callback) 11 { 12 InitializeComponent(); 13 this.callback = callback; 14 } 15 16 private void btn_Click(object sender, EventArgs e) 17 { 18 callback.ChangeText(txt.Text); 19 } 20 }
运行结果:
浮躁的人容易问:我到底该学什么;----别问,学就对了; 浮躁的人容易问:JS有钱途吗;----建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。