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

通过委托实现跨窗体传值

前言

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

正文

1、委托及事件

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

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

1.在子窗体中定义委托

csharp 复制代码
        public delegate void 委托类型名(参数列表);

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

csharp 复制代码
        public event 委托类型名 事件名称;

3.调用委托类型事件

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

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

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

5.实现具体的事件

csharp 复制代码
        public void 方法名(参数列表)
        {
            具体方法
        }

3、具体示例

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

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

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

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

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

    csharp 复制代码
            /// <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. 主窗体代码

    csharp 复制代码
    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. 子窗体代码

    csharp 复制代码
    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、实现效果

相关推荐
CXDNW4 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙4 分钟前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
IT技术分享社区14 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
ssf-yasuo17 分钟前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt
As977_27 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi30 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking30 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
道法自然04021 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器