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;
    }

 

  

posted @ 2020-03-26 11:18  包子789654  阅读(253)  评论(0编辑  收藏  举报