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",中括号里的名字要与子组件中 ...
随机推荐
- position 属性的值的比较
可取的四个值:static/relative/absolute/fixed static:默认值,top/right/bottom/left 无作用,z-index无效 relative:相对于原来的 ...
- Python快速入门
Python快速入门 一.基础概要 命名:h.py Linux命令行运行:python h.py 注释.数字.字符串: 基本类型只有数字与字符串 #python注释是这样写的 ''' 当然也可以这样 ...
- 利用"SQL"语句自动生成序号的两种方式
1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...
- 潭州课堂25班:Ph201805201 django 项目 第十九课 文章主页数据库模型,前后台功能实现 (课堂笔记)
-数据库模型设计 : 文章:新闻表: 字段:图片,标题,摘要,类型,作者,创建时间 标签表 评论表, 轮播图:外键,指向文章的外键表 在 utls 目录下创建 models.py 把其它模型常用的字 ...
- 封装、property特性及绑定与非绑定方法
1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...
- (转)我是一个java class
前言:本文主要想讲一下Java虚拟机的故事, 可能有点偏门,不妥之处欢迎留言交流. 第一回 陌生警察 我出生在C盘下面一个很深层次的目录下, 也不知道是谁把我放到这里的. 我一直在睡觉,外边的日出日落 ...
- BZOJ2268 : Wormly
考虑头部,一定是能向前就向前,因此是最左边的腿往右$b-1$个位置. 头部移动之后,腿部就要相应地移动到区间内最靠右的$l$个$1$之上. 若头部和腿部都不能移动,检查是否到达终点即可. 用前缀和以及 ...
- Ruby面向对象
Ruby面向对象 Ruby是真正的面向对象语言,一切皆为对象,甚至基本数据类型都是对象 基本用法 class Box # 构造函数 def initialize(w,h) @with, @heig ...
- Css3 实现循环留言滚动效果(一)
一.常见留言滚动效果示例 html代码 <div class="runList"> <div class="runitem"> < ...
- Ubuntu 18 LTS netplan 网络配置
一.配置网络 1.通过netplan配置网络 #配置网络 nulige@ubuntu:/etc/netplan$ sudo apt install ifupdown nulige@ubuntu:/et ...