zoukankan      html  css  js  c++  java
  • C#学习笔记(36)——事件传值(非常牛逼!)

    说明(2018-4-9 23:01:20):

    1. 这个真的想了很久,从晚上八点半写完上一篇博客,一直想到现在11点,以为没有办法实现了,结果看到一篇CSDN的文章,虽然没有看明白,但是看到一行代码后灵光一闪。原文地址https://blog.csdn.net/happythomas/article/details/32120741,在里面作者也是看了另一篇文章https://bbs.csdn.net/topics/300200223,居然是09年的上古文章,里面的代码写法都有点看不懂,RoutedEventArgs 好像是WPF里的路由事件?不管了,以后用到再说吧!

    2. 本来我很幼稚的以为在Form1里定义一个事件public event EventHandler MyEve,就能在Form2里用了。后来发现VS直接报错,百思不得其解,凭啥委托就能在Form2里拿到?事件就不行?

     

     

     

    于是在群里问大佬,大佬回了一句:

    羞愧难当,说了句谢谢就滚去查资料了o(* ̄︶ ̄*)o

    3. 然后就看到了上面的文章,其中的核心技术就是:在Form1中初始化Form2之后,就把Form1中的方法绑定到Form2的事件上。这一点其实和之前委托传值有点类似,委托传值是在Form2中加一个构造函数,在Form1中初始化Form2的时候把委托作为参数传入Form2。哇?写到这里我怎么觉得两种方法一毛一样?隐隐觉得底层应该是一种写法?不过我不太喜欢再写个构造函数,也不喜欢命名空间下面再写个委托声明,直接定义事件多简单。

    4. 下面贴代码:

    Form1.cs:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace _08事件传值
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            //public delegate void EventHandler(object sender, EventArgs e);
            //实例化FORM1 才能访问到FORM1下的公共成员(请教群里大佬,为啥在Form2里获取不到MyEve)
            //public event MyDel Mdl;
            public event EventHandler MyEve;
            private void button1_Click(object sender, EventArgs e)
            {
    
                Form2 f2 = new Form2();
                //这一步必须要实例化f2才能绑定事件吗?
                MyEve += f2.ShowTxt;
                //试试在这里绑定Form2里的事件,试完可以!太牛逼了!!
                f2.MyEve2 += ShowTxt2;
                MyEventArgs mea = new MyEventArgs();
                mea.Str = textBox1.Text;
                if (MyEve != null)
                {
                    MyEve(this, mea);
                    f2.ShowDialog();
                }
                else
                {
                    MessageBox.Show("MyEve为空");
                }
            }
            public void ShowTxt2(object sender, EventArgs e)
            {
                MyEventArgs mea = e as MyEventArgs;
                textBox1.Text = mea.Str;
            }
        }
        public class MyEventArgs : EventArgs
        {
            public string Str { get; set; }
        }
    }

    Form2.cs:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace _08事件传值
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            //另一种传值方法,在Form2里定义一个属性,在Form1里实例化Form2的时候赋值
            
            private void Form2_Load(object sender, EventArgs e)
            {
                
            }
            public event EventHandler MyEve2;
            private void button1_Click(object sender, EventArgs e)
            {
                if (MyEve2!=null)
                {
                    MyEventArgs mea = new MyEventArgs();
                    mea.Str = textBox1.Text;
                    MyEve2(this,mea);
                }
            }
    
            public void ShowTxt(object sender, EventArgs e)
            {
                MyEventArgs mea = e as MyEventArgs;
                textBox1.Text = mea.Str;
            }
    
        }
        
    }

    运行效果:

    总结:

    1. 事件的套路就是:

    (1)在第一个窗体里定义一个事件:public event EventHandler MyEve;

    (2)在第二个窗体里写一个方法:public void ShowTxt(object sender, EventArgs e),有参数的话顺便建一个参数类传参:public class MyEventArgs : EventArgs

    (3)在第一个窗体里绑定这个方法,然后调用。

    2. 通过写这几个例子,对事件的使用熟练了许多,认识也加深了一些。但是感觉现在的事件都是用来窗体传值,不知道后面还会接触到什么其他应用?

     

  • 相关阅读:
    redis之Scan
    redis之GeoHash
    redis之漏斗限流
    redis之布隆过滤器
    redis之HyperLogLog
    redis位图
    redis延迟队列
    redis分布式锁
    如何安装redis
    社区首款 OAM 可视化平台发布!关注点分离、用户友好、上手难度低
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/8764469.html
Copyright © 2011-2022 走看看