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

     

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/8764469.html
Copyright © 2011-2022 走看看