C#窗体间常用的几种传值方式、以及委托与事件的详细介绍
窗体间的传值,最好使用委托方式传值,开始之前,我们先来说一下委托与事件的关系。
委托:是一个类。
事件:是委托类型的一个特殊实例,只能在类的内部触发执行。
首先创建2个窗体,这里我们以form1为发送窗体,form2为接收窗体
form1窗体
form2窗体
方式一(最简单的方式)
form1窗体代码
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 事件的方式实现窗体间传值
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Form2 msgFrm { get; set; }
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
msgFrm = f2;
f2.Show();
} private void btnSendMsg_Click(object sender, EventArgs e)
{
//对象内部的,字段或者元素属性最好不要直接让外部直接访问
//最好是通过,设置的方法来控制一下
msgFrm.SetTxt(this.txtMsg.Text); }
}
}
form2窗体代码
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 事件的方式实现窗体间传值
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetTxt(string txt)
{
this.txtMsg.Text = txt;
}
}
}
方式二(委托方式)
注:委托不熟悉的宝宝们,请自行查阅Func与Action,以及delegate三者区别,这里我们用系统内置的委托Action
form1窗体代码
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 事件的方式实现窗体间传值
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定义委托
public Action<string> afterMsgSend { get; set; }
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
afterMsgSend += f2.SetTxt; //给系统内置的委托注册事件
f2.Show();
} private void btnSendMsg_Click(object sender, EventArgs e)
{
if (afterMsgSend == null)
{
return;
}
afterMsgSend(this.txtMsg.Text);
}
}
}
form2窗体代码
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 事件的方式实现窗体间传值
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetTxt(string txt)
{
this.txtMsg.Text = txt;
}
}
}
方式三(事件方式,更安全哟)
TextBoxMsgChangeEventArg类继承EventArgs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 事件的方式实现窗体间传值
{
public class TextBoxMsgChangeEventArg:EventArgs
{
public string Text { get; set; }
}
}
form1窗体代码
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 事件的方式实现窗体间传值
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public event EventHandler AfterMsgChange;
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
AfterMsgChange += f2.AfterTxtChange;
f2.Show();
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
AfterMsgChange(this, new TextBoxMsgChangeEventArg() { Text = this.txtMsg.Text });
}
}
}
form2窗体
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 事件的方式实现窗体间传值
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void AfterTxtChange(object sender,EventArgs e)
{
//拿到父窗体传来的文本,强转数据类型
TextBoxMsgChangeEventArg arg = e as TextBoxMsgChangeEventArg;
this.SetTxt(arg.Text);
}
}
}
还有不懂的宝宝们,欢迎下方留言~
C#窗体间常用的几种传值方式、以及委托与事件的详细介绍的更多相关文章
- Vue中常用的几种传值方式
Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...
- Vue中常用的三种传值方式
父传子 父子组件的关系可以总结为prop向下传递,事件向上传递.父组件通过prop给子组件下发数据,子组件通过事件给父组件发送消息. 父组件: <template> <div> ...
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...
- Vue 常用三种传值方式
Vue常用的三种传值方式: 父传子 子传父 非父子传值 引用官网一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递.父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消 ...
- django之创建第7-6-第三种传值方式
1.创建bar.html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- django之创建第7-5-第二种传值方式(time/1232/xiaodneg)
1.修改views文件 def foo(request,myID,myName): t = loader.get_template("foo.html") user = {&quo ...
- 【温故知新】——原生js中常用的四种循环方式
一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0 网页输出“欢迎下次光临” 在网页中弹出框输入1 网页输出“查询中……” 在 ...
- C#窗体间通讯的几种处理方法
应用程序开发中,经常需要多窗体之间进行数据通信,写几个例子,把几种常用的通信方式总结一下: 主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是Tex ...
- 浅谈Asp.Net中的几种传值方式
一.使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...
随机推荐
- OAuth2.0授权登录
最近工作中遇到了多系统间的授权登录,对OAuth2.0进行了学习研究,并总结备忘. [场景] 我们登录一些论坛等网站的时候,如果不想单独注册该网站账号,可以选择用微信或QQ账号进行授权登录. 这样的第 ...
- Docker 镜像与容器
镜像和容器的关系 容器提交 commint 作用: 根据容器生成一个新的镜像 命令格式: docker commit [OPTIONS] CONTAIN ...
- 松软科技web课堂:SQLServer之LEN() 函数
LEN() 函数 LEN 函数返回文本字段中值的长度. SQL LEN() 语法 SELECT LEN(column_name) FROM table_name SQL LEN() 实例 我们拥有下面 ...
- js的try catch使用心得
1 try catch的使用,永远应该放在你的控制范围之内,而不应该防范未知的错误.也就是说你很清楚知道这里是有可能”出错“的,而且你很清楚知道什么前提下会出错,你就是要故意利用报错信息来区分错误 ...
- 百度地图API----搜索地址,获取该点的位置坐标并转换成WebMercator
function doFind(){ LoadBaiduMapScript().then(BaiduMap).then(function () { //查询并获取坐标 var myGeo = new ...
- Nuget使用时遇到的问题,Solved
在VS的程序包管理控制台中输入Install-package MySql.Data时,默认安装最新的版本8.0.18, 但是安装完成后,发现包并没有添加到项目的引用列表中, 在解决方案的package ...
- JAVA笔试题(全解)
目录 一. Java基础部分................................................................. 9 1.一个".java& ...
- 【西北师大-2108Java】第五次作业成绩汇总
[西北师大-2108Java]第五次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第7周学习指导及要求 实验目的与要求 (1)掌握四种访问权限修饰符的使用特点: (2)掌握Object类的用途 ...
- acwing 49. 二叉搜索树与双向链表
地址:https://www.acwing.com/problem/content/87/ 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点,只能调整树中结点指针 ...
- AcWing 154. 滑动窗口 单调队列
地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...