Winform中事件和委托的应用实现窗体传值
第一步:新建2个窗体
主窗体的代码,弹出 下载的窗体
public partial class FormMain : Form { public FormMain() { InitializeComponent(); } //弹出下载的窗体 private void button1_Click(object sender, EventArgs e) { FormLoad fl = new FormLoad(); fl.Show(); } }
//下载按钮单击事件 private void button1_Click(object sender, EventArgs e) { DownLoad(); } //更新进度条的方法 private void DownLoad() { for (int i = 0; i < 100; i++) { this.progressBar1.Value = i; Thread.Sleep(100); } }
这个时候,点击下载按钮,进度条更新,两个窗体界面都动不了,假死现象发生啦。
第二步:处理窗体假死问题
用多线程和委托
public FormLoad() { InitializeComponent(); //为这个委托变量赋值,就是给一个方法的名字 //委托没有返回值,方法也不能有返回值,要保持一致 changeProgress = FunChangeProgress; } //创建一个方法, private void FunChangeProgress(int value) { this.progressBar1.Value = value; } //下载按钮单击事件 private void button1_Click(object sender, EventArgs e) { //创建一个线程 Thread thr = new Thread(new ParameterizedThreadStart(DownLoad)); //ParameterizedThreadStart表示线程中执行的方法 thr.Start("suibian");//因为DownLoad(object obj)参数是object,所以这里传什么都可以 } //更新进度条的方法 private void DownLoad(object obj) //因为ParameterizedThreadStart是一个委托,这个委托要传入object参数 //所以DownLoad也要传入object参数 { for (int i = 0; i < 100; i++) { //执行委托,会自动的执行委托对应的方法 //changeProgress(i); //changeProgress(i);直接用这个会报警跨线程执行UI控件 //用Invoke解决跨线程执行UI问题 this.progressBar1.Invoke(changeProgress, i); Thread.Sleep(100); } //下载完成后执行的 eventShowInfo("下载完成"); } //在下载窗体界面,建立一个委托,定义委托 public delegate void ChangeProgress(int value); //创建一个上面委托类型的变量 public ChangeProgress changeProgress;
第三步:下载窗体接受,传值给主窗体
主窗体中的代码
public partial class FormMain : Form { public FormMain() { InitializeComponent(); sif = ShowInfoFun; } public void ShowInfoFun(string text) { this.label1.Text = text; } //弹出下载的窗体 private void button1_Click(object sender, EventArgs e) { FormLoad fl = new FormLoad(); //在主窗体中 注册子窗体的事件 fl.eventShowInfo += new FormLoad.ShowInfo(abcd); fl.Show(); } //事件的执行方法 void abcd(string text) { this.label1.Invoke(sif, text); } //在出窗体创建一个委托 public delegate void ShowInfo(string text); //创建一个委托变量 private ShowInfo sif; }