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. 通过写这几个例子,对事件的使用熟练了许多,认识也加深了一些。但是感觉现在的事件都是用来窗体传值,不知道后面还会接触到什么其他应用?
C#学习笔记(36)——事件传值(非常牛逼!)的更多相关文章
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- iOS学习笔记--触摸事件
最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...
- [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡
当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...
- vue学习笔记(四)事件处理器
前言 在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- JavaScript高级程序设计学习笔记之事件
1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...
- angular学习笔记 父子组件传值
一.如何将父组件的值传到子组件? 在子组件里面引入Input,然后用@Input 变量1 接收 接着在父组件中的,子组件标签上添加[msg]="msg",中括号里的名字要与子组件中 ...
随机推荐
- CCF-炉石传说
#include<cstdio> typedef struct { int attack,health; } cus; cus info[][]; ]; ; void summon(); ...
- BZOJ2821 作诗(Poetize) 分块
题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 查询的内容: 区 ...
- python基础一 ------顺序结构队列的python实现
队列:先进先出的线性表(FIFO),只允许在一段插入并在另一端取出 以下是python实现 #-*-coding:utf-8-*- #顺序存储队列的python实现 class Queue(objec ...
- Python2.*与Python3.*共存问题
安装Python 2.7后,本来在3.4下能正常使用的脚本无法运行.网上有的方法是把两个版本的主程序分别改名为python2和python3,人眼判断脚本,手输命令行执行脚本.像我这样喜欢双击.拖拽的 ...
- 获取Android设备WIFI的MAC地址 “MAC地址”
需要指出的是:wifi状态和wifi AP状态是互斥的状态:也就是一旦发现WIFI AP打开,WIFI是不能被打开的. 获取Android设备的WIFI MAC地址,首先需要将设备中的WIFI个人热点 ...
- JS 函数表达式
定义函数的方式有两种, 一种是函数声明,一种就是函数表达式了 函数声明最常见了, sayHi(); // 函数声明会发生提升 function sayHi () { alert('Hi') } 函数表 ...
- Vue(十六)vue-router路由
一. vue-router路由 1. 简介 使用Vue.js开发SPA(Single Page Application)单页面应用 根据不同url地址,显示不同的内容,但显示在同一个页面中,称为单 ...
- Application-Level层级异常捕获并定位程序的异常位置
最近遇到一个需求,在设置503错误页面时,如果程序出错,服务器自动发邮件通知所有程序员,方便程序员及时解决问题. 想到好像global.cs文件里面好像有个erro事件,然后找到了Applicatio ...
- MUI学习04-开关按钮
HTML代码如下: <div class="mui-switch"> <div class="mui-switch-handle">&l ...
- Glide4 用法总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...