zoukankan      html  css  js  c++  java
  • 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;
        }

      

  • 相关阅读:
    Linux下卸载mysql
    ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
    Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
    Java Web 深入分析(6) Tomcat
    CSS 类选择器
    myeclipse 破解
    Java Web 深入分析(5) Java ClassLoader 工作机制
    JFinal(2)JFinal 学习资料
    JFinal(1)JFinal helloworld
    Java Web 深入分析(4) Java IO 深入分析
  • 原文地址:https://www.cnblogs.com/baozi789654/p/11608330.html
Copyright © 2011-2022 走看看