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

这篇具有很好参考价值的文章主要介绍了【Winform学习笔记(八)】通过委托实现跨窗体传值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

正文

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、实现效果

【Winform学习笔记(八)】通过委托实现跨窗体传值,C#学习笔记,# WinForm学习笔记,学习,笔记,c#,Winform,委托文章来源地址https://www.toymoban.com/news/detail-666497.html

到了这里,关于【Winform学习笔记(八)】通过委托实现跨窗体传值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c#winform窗体如何实现数据的保存和读取

    学生类代码内容如下: 在c#winform中我们在写程序时,经常需要进行数据处理,那么数据如何保存和读取(下面我们通过序列化和反序列化的方式来实现) 首先我们建立一个外部实体类(Student类) 学生类代码内容如下: 第二步构建winform窗体  第三步:从图上按钮可以发现现在

    2024年02月02日
    浏览(36)
  • Winform窗体利用WebApi接口实现ModbusTCP数据服务

    在上位机开发过程中,有时候会遇到需要提供数据接口给MES或者其他系统,今天跟大家分享一下,如何在Winform等桌面应用程序中,开发WebApi接口,提供对外modbus设备的数据服务。通讯模型是: 为了更好地演示应用场景,本案例以读取ModbusTCP设备为例,开发好WeiApi接口后,第

    2024年02月05日
    浏览(47)
  • WinForm使用Prism和DryIoc实现跨窗体数据绑定

    使用Prism和DryIoc实现跨窗体数据绑定 开发环境: VS2022 .Net 6.0 WinForm界面程序 要求: DryIoc容器注册为单例(Singleton)=DryIoc VM需要实现数据更改通知=Prism 控件数据限幅要一样=NumericUpDown 🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️ 效果: Form2修改Score时Form1立即

    2024年02月10日
    浏览(40)
  • C# winform usercontrol控件跟随主窗体实现自动大小

    usercontrol控件跟随主窗体实现自动大小 今天是跟着哗哩哗哩大学学习C的第N天,但是是学习usercontrol的第一天。 第一天遇到的问题就是如何将usercontrol的大小跟随主窗体的一起变大变小。视频中教得很详细,首先是将usercontrol控件实例化,接着就是设置usercontrol的dock属性为fil

    2024年02月12日
    浏览(45)
  • 【WinForm】WinForm常见窗体技术汇总

    窗体调用外部程序与渐变窗体 按回车键跳转窗体中的光标焦点 剪切板操作 实现拖放操作 移动的窗体 抓不到的窗体 MDI窗体 提示关闭窗体 窗体正在变色: 窗体调用网络页面–启动浏览器: 窗体调用本地程序–启动记事本: 按下enter键,光标会向下移动: 第一个text中输入内

    2024年02月08日
    浏览(49)
  • C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11

    在做winform窗体UI美化时,一般都需要将窗体的FormBorderStyle属性设为None,之后窗体就会没有最上面的标题栏,然后按照UI进行界面的设计。美化的代价就是窗体本来标题栏的相关操作,例如双击自动最大化,再次双击又恢复正常大小,以及上窗体关闭、最小化等功能就都需要自

    2024年02月08日
    浏览(53)
  • winform窗体

    WinForm,是·Net开发平台中对Windows Form的一种称谓。WinForm是窗体应用程序,由若干个窗体应用组成,基于C/S架构 (1)基本控件: label 文本提示 TextBox 文本框 button      按钮 radiobutton 单选按钮 panel       面板(相当于小容器) check 复选框 combox        下拉列表框 listbox  列表

    2024年02月08日
    浏览(69)
  • 【C#】【WinForm】MDI窗体

    MDI窗体的相关学习使用 1、设置MDI父窗体  在属性中找到IsMdiContainer选项,设置为True 2、添加MDI子窗体,在项目中依次选择添加-窗体,然后一直默认即可  添加后的项目目录(Form1为父窗口,Form2、Form3为子窗口)  3、在Form1.cs中,创建对应MDI子窗口的对象并调用显示出来 保存

    2024年02月08日
    浏览(47)
  • Winform窗体使用IOC容器

    Winform窗体如何使用IOC容器呢?在nuget中添加Microsoft.Extensions.DependencyInjection 接着在Program类Main方法中添加一下代码 在此类中继续补充以下代码 以后你的注入只需要在 static void ConfigureServices(IServiceCollection services)这个方法中注入就行了 全景图:   我把窗体也注入了,不过不是

    2024年02月12日
    浏览(51)
  • winform窗体闪烁问题解决方式

    winform窗体闪烁问题解决方式 1、使用窗体双缓冲 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); 窗体的DoubleBuffered 指示是否对控件进行双缓存处理。 2、使用CreateParams的使用解决闪屏问题

    2024年02月12日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包