【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值

  • 前言
  • 正文
    • 1、委托及事件
    • 2、通过委托实现跨窗体传值的步骤
      • 1.在子窗体中定义委托
      • 2.在子窗体中声明一个委托类型的事件
      • 3.调用委托类型事件
      • 4.在实例化子窗体后,子窗体订阅事件接受方法
      • 5.实现具体的事件
    • 3、具体示例
    • 4、完整代码
    • 5、实现效果

前言

在本文中主要介绍 如何通过委托实现跨窗体传值,并以简单的示例进行展示。

正文

1、委托及事件

  1. 委托:委托是方法的抽象,与类一样是一种用户自定义类型,存储的是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行;
  2. 委托类型声明:委托是类型,与类class 处于同一个级别,委托类型必须在被用来创建变量之前声明:a、以deleagate关键字开头 b、返回类型+委托类型名+参数列表(可以为空):修饰符 delegate 返回类型 委托类型名(参数列表)
  3. 委托与方法的区别:委托只是一个命令,做事情的是方法,在代码世界中委托只是存储了各个方法的地址,而它自己是什么也不做的;
  4. 委托的开发步骤:a、定义一个委托 b、定义一个委托类型的变量 c、给委托赋值(绑定方法) d、调用委托;
  5. 事件:事件是基于委托的,为委托提供一个订阅或发布的机制;事件是一种特殊的委托,调用事件和委托是一样的;
  6. 事件声明:事件可以被看作是委托类型的一个变量,通过事件注册、取消多个委托和方法;修饰符 event 委托类型 事件名称

2、通过委托实现跨窗体传值的步骤

1.在子窗体中定义委托

        public delegate void 委托类型名(参数列表);

2.在子窗体中声明一个委托类型的事件

        public event 委托类型名 事件名称;

3.调用委托类型事件

        private void button1_Click(object sender, EventArgs e)
        {
            事件名称(参数列表);
        }

4.在实例化子窗体后,子窗体订阅事件接受方法

        private void button2_Click(object sender, EventArgs e)
        {
            f2 = new Form2();
            f2.Show();
            f2.事件名称 += new Form2.委托类型名(方法名);
        }

5.实现具体的事件

        public void 方法名(参数列表)
        {
            具体方法
        }

3、具体示例

  1. 在子窗体中定义定义一个委托,委托类型名为SendValue,需要传递2个参数

            //1、先在子窗体中定义一个委托,根据实际需求定义委托;这个SendValue委托中需要传递2个参数
            public delegate void SendValue(int a,int b);
    
  2. 在子窗体中声明一个委托类型的事件,委托类型为SendValue,事件名称为SendVauleEvent

            //2、在子窗体中声明一个委托类型的事件,将委托与事件相关联
            public event SendValue SendVauleEvent;
    
  3. 在button1的Click事件中,调用委托类型事件SendVauleEvent

            private void button1_Click(object sender, EventArgs e)
            {
                //3、调用(实现)委托类型事件,并传递相关参数
                SendVauleEvent(1, 5);
            }
    
  4. 在实例化子窗体后,子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情

            private void button2_Click(object sender, EventArgs e)
            {
                //实例化窗体2
                f2 = new Form2();
                f2.Show();
                //4、在实例化子窗体后,声明子窗体的事件,即初始化事件
                //子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情
                f2.SendVauleEvent += new Form2.SendValue(Add);//接受的方法 :Add
            }
    
  5. 实现具体的事件Add(),实现简单的加法运算

            /// <summary>
            /// 5、实现具体的事件,定义一个方法
            /// </summary>
            /// <param name="a">参数1</param>
            /// <param name="b">参数2</param>
            public void Add(int a,int b)
            {
                label1.Text = (a + b).ToString();
            }
    

4、完整代码

  1. 主窗体代码

    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 DelegatePractice
    {
        public partial class Form1 : Form
        {
            public Form2 f2;
            public Form1()
            {
                InitializeComponent();
                ///跨界面传值
                ///1、主界面处理只需要实例化其他界面即可
                ///2、在需要的界面申明委托和事件
                ///3、在主界面订阅事件和接受方法即可
            }
    
    
            /// <summary>
            /// 5、实现具体的事件,定义一个方法
            /// </summary>
            /// <param name="a">参数1</param>
            /// <param name="b">参数2</param>
            public void Add(int a,int b)
            {
                label1.Text = (a + b).ToString();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                //实例化窗体2
                f2 = new Form2();
                f2.Show();
                //4、在实例化子窗体后,声明子窗体的事件,即初始化事件
                //子窗体订阅事件接受方法,相当于子窗体委托主窗体做了一个事情
                f2.SendVauleEvent += new Form2.SendValue(Add);//接受的方法 :Add
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Add(1, 2);
            }
        }
    }
    
    
  2. 子窗体代码

    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 DelegatePractice
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            //1、先在子窗体中定义一个委托,根据实际需求定义委托;这个SendValue委托中需要传递2个参数
            public delegate void SendValue(int a,int b);
            //2、在子窗体中声明一个委托类型的事件,将委托与事件相关联
            public event SendValue SendVauleEvent;
    
            private void button1_Click(object sender, EventArgs e)
            {
                //3、调用(实现)委托类型事件,并传递相关参数
                SendVauleEvent(1, 5);
            }
        }
    }
    
    

5、实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读_条件控制_ControlNet

name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: …

解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案

政务行业是国家治理的重要组成部分&#xff0c;涉及到国家安全、社会稳定、民生福祉等方面。随着信息技术的快速发展和革新&#xff0c;政务信息化也迎来了新一轮的升级浪潮。国家相继出台了《国家信息化发展战略纲要》《“十三五”国家信息化规划》《“十四五”推进国家政务信…

华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。 由于…

算法笔记(一):时间复杂度

省略的技巧 已知 f ( n ) f(n) f(n) 来说&#xff0c;求 g ( n ) g(n) g(n) 表达式中相乘的常量&#xff0c;可以省略&#xff0c;如 f ( n ) 100 ∗ n 2 f(n) 100*n^2 f(n)100∗n2 中的 100 100 100 多项式中数量规模更小&#xff08;低次项&#xff09;的表达式&#…

基于JSP+Servlet+mysql养老院管理系统

基于JSPServletmysql养老院管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的养老院管理系统 [yanglaoyuan] 当前版本&#xff1a;V1.0.0版本 难度等级&#xff1a;✩✩点…

使用Dockker创建vwas容器时报错的解决方法

执行命令 docker run -it -d -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs没有详细看报错之前找了各种各样的解决办法&#xff0c;都无法解决。因此以后在看报错提示的时候耐心一点看关键词Error 后来才发现启动vwas时docker报了这个错&#xff1a; OSError: …

人力资源小程序的设计与开发步骤

在当前信息化时代&#xff0c;小程序成为了各行各业提升用户体验和服务效率的重要渠道。人力资源部门也可以通过定制开发人力资源小程序来提升招聘、培训、员工福利等方面的工作效率。接下来&#xff0c;我们将介绍人力资源小程序定制系统开发的具体流程。 首先&#xff0c;我们…

Facebook HiPlot “让理解高维数据变得容易”

在这个全球信息化的时代&#xff0c;数据量呈爆炸式增长&#xff0c;数据的复杂性也是如此。如何有效地处理高维数据并找到隐藏在其中的相关性和模式是一个严峻的挑战。近年来&#xff0c;可视化和可视化分析已被应用于该任务&#xff0c;并取得了一些积极成果。Facebook的新Hi…

1782. 统计点对的数目

给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数…

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度&#xff1a; 76 / 4 19 第五次迭代结束速度&#xff1a; &#xff08;76 24 &#xff09; / 5 100 / 5 20

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息&#xff0c;B/S有的东西&#xff0c;C/S当然也可以有&#xff0c;就像QQ的消息提示一样&#xff01; 实现一个类似的东西并不困难&#xff0c;只要想明白原理实现起来就很简单了&#xff01; 实现原理&#xff1a; &#xff08;1&#…

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时&#xff0c;find_package 报错&#xff1a; Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …

Systick滴答定时器

今天&#xff0c;对Systick滴答定时器进行资料的整理&#xff0c;这个定时器在程序中的作用就是提供延时函数。参考&#xff08;【STM32】Systick滴答定时器_一只大喵咪1201的博客-CSDN博客&#xff09; Systick滴答定时器的介绍 相关寄存器 寄存器CTRL 补充HCLK 寄存器LOAD…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

2023年高教社杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

[蓝帽杯 2022 初赛]domainhacker

打开流量包&#xff0c;追踪TCP流&#xff0c;看到一串url编码 放到瑞士军刀里面解密 最下面这一串会觉得像base64编码 删掉前面两个字符就可以base64解码 依次类推&#xff0c;提取到第13个流&#xff0c;得到一串编码其中里面有密码 导出http对象 发现最后有个1.rar文件 不出…

FANUC机器人加减速倍率指令ACC的使用方法说明

FANUC机器人加减速倍率指令ACC的使用方法说明 单位有一台FANUC机器人(型号:M-900iB 360kg),偶尔会在启动的瞬间会报SRVO-050碰撞检测报警,而事实上机器人并没有开始移动或和其他工件产生碰撞,一直查了很长时间,也没有查到具体的原因,也尝试过重新进行负载推算,但是偶尔…

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码&#xff0c;安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速&#xff1a; import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…

Electron 报gpu_process_host.cc(951)] GPU process launch faile错误

解决方法&#xff0c;在入口js文件中&#xff0c;添加如下代码: app.commandLine.appendSwitch(no-sandbox)

All In One!Meta发布SeamlessM4T,支持100种语言,35种语音、开源、在线体验!

多语言识别翻译的研究一直都是学术界研究的重点。目前全球有几千种语言&#xff0c;在全球化背景下不同语言人群之间的交流越来越密切&#xff0c;然而学习一门外语的成本是非常大的。前两年的研究主要集中在一对一、一对多的研究&#xff0c;然而当面对这么多的语言时&#xf…