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是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...
随机推荐
- python通过多线程并获取返回值
以下是多线程获取返回值的一种实现方式 # -*-coding:utf-8-*- from time import ctime, sleep import threading import numpy ...
- 【nodejs原理&源码赏析(5)】net模块与通讯的实现
目录 一. net模块简介 二. Client-Server的通讯 2.1 server的建立 2.2 Socket的建立 三. IPC通讯 四. 撸一个简易的cluster通讯模型 示例代码托管在: ...
- 【带着canvas去流浪(9)】粒子动画
目录 一. 粒子特效 二. 开发中遇到的问题 2.1 卡顿 2.2 轨迹 2.3 复位 2.4 防护层 2.5 二维向量类 三. 实现讲解 3.1 粒子类的update方法 3.2 粒子群的绘制 3. ...
- java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService
这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...
- JS基础语法---作用域
作用域:使用范围 全局变量: 声明的变量是使用var声明的, 那么这个变量就是全局变量 全局变量可以在页面的任何位置使用 除了函数以外, 其他的任何位置定义的变量都是全局变量 局部变量:在函数内部定义 ...
- CSS学习笔记_1
1.调用 内部样式表: css可以直接在html代码里面使用</style></style>节点.允许html代码中有两个style节点,但是起作用的是靠后的节点 如图的代码, ...
- 使用adb命令操控Android手机(adb命令)
1) 手机连接电脑之前 首先,查看安卓手机是否已经连接上电脑 adb devices 让adb一直查找安卓设备,找到后才停止 adb wait-for-device 2) 手机连接电脑后的操作 2.0 ...
- YARN HA部署架构
hadoop001: zk rm(zkfc线程) nm hadoop002: zk rm(zkfc线程) nm hadoop003: zk nm RMStateStore: 存储在ZK的/rmstor ...
- bay——安装_Oracle 12C-单实例-Centos7 -DG.txt
用户和密码: root/bayaimbayaim/064286BAIbayoracle/oracleSID:orclsys/oraclesystem/oraclempay/mpaydx/dx ---- ...
- 201871010112-梁丽珍《面向对象程序设计(java)》第一周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ...