利用委托来进行窗口间的传值

  以前如果碰到子窗体(ShowDialog显示)中的的改变会影响父窗体子控件内容时,要么就在ShowDialog()结束后更新数据,要么就把子控件设置为public。

1.ShowDialog方式:不能立马看到更新结果,ShowDialog会阻断当前线程,一定要等到子窗体关闭后,线程才被唤醒。

2.把控件设置了public 需要实例化父窗体,父窗体是一个大对象,虽然最终会被GC回收,GC也不知道什么时候才会把这个大对象销毁掉(书上说要等到内存不够用的时候),但始终会占用内存一段时间,影响性能不说,只为访问一个子控件而实例化一个大对象,得不偿失。

3.使用事件解决问题,既然当前主线程被锁定了,用户自己无法更新数据,这时候可以委托别人来做事(委托的好处),就像自己不能打官司一样,可以请律师来帮忙。顺便自己也可以复习一下事件与委托之间的关系:事件就是一个委托

我们随便新建一个Winform项目,再新建两个窗体MainForm.cs,ChildForm.cs。再新建一个CallBack.cs类。

利用委托来进行窗口间的传值_第1张图片  利用委托来进行窗口间的传值_第2张图片  

 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     }

运行结果:

                  利用委托来进行窗口间的传值_第3张图片

 

你可能感兴趣的:(传值)