当前位置: 首页 > news >正文

委托在窗体通信方面的见解

  首次博客内容是将自己对于委托在窗体通信方面的应用做一次总结,也算是将自己的见解用言语来表达出来吧。在开始接触委托时云里雾里,完全没有这个概念的存在,更不用提委托用于窗体通信之中这么高深的运用了尽管在现在看来我还是觉得委托用在窗体通信中是一件很神奇的事情,不是说没有弄懂,而是说这里面的逻辑思维也值得我们去学习(思维是个关键的东西,一旦理解了,也会顺水推舟)。

 

  首先委托的格式想必是一目了然 

public delegate void MessageDele(string Message);

   ​委托的五大步骤:

    1.声明委托

    2.根据委托创建具体方法

    3.创建委托变量

    4.委托变量关联具体方法

    5.调用委托​

  然而在此处如果我们将窗体通信想象成主窗体和从窗体通信的话,那么必然存在一个问题,委托变量的放置问题。(本次只考虑主从窗体通信这种特殊情形,其余情形照搬该逻辑思路即可了)。例如,如果是主窗体向从窗体发送信息,是在主窗体里面定义委托变量并且绑定相关从窗体的方法,还是从窗体内定义委托变量,并且将委托变量与自身的相关方法进行绑定(该方法好比说是将主窗体传过来的信息展现出来),然后在主窗体中创建从窗体对象后,调用从窗体对象的委托变量用来发送信息呢。又或是在从窗体向主窗体​发送信息情况下,委托变量是跟随谁的问题,一种是将委托变量定义在从窗体中,在主窗体中创建从窗体对象,然后通过从窗体对象去调用内部成员委托变量,并且绑定主窗体中的相关方法,另一种情况是主窗体中定义委托变量,并且绑定相关方法,再主窗体中创建从窗体对象,通过从窗体去调用主窗体中的委托(然而基本上这种方式完全不太推荐使用,不是说不可以用而是实现的步骤太过于复杂,付出的成本大于了其收益)。

 

一、主窗体向从窗体发送信息​

  主窗体中定义委托变量:

public partial class FrmMain : Form
{
    //​【3】创建委托变量
    public MessageDele objMessageDele;

    public FrmMain()
    {
        InitializeComponent();

        FrmOther objFrmOther = new FrmOther();

        objFrmOther.Show();

        //【4】委托变量绑定方法​
        objMessageDele += objFrmOther.Message;
    }

    //【5】调用​委托变量
    private void btnclick_Click(object sender, EventArgs e)
    {
        objMessageDele(txt1.Text.ToString());
    }
}

//【1】声明委托(定义一个函数原型:返回值+参数类型+个数)
public delegate void ShowCount(string message);

   窗体提供委托实现方法:

public partial class FrmOther : Form
{
    public FrmOther()
    {
        InitializeComponent();
    }

    //【2】根据委托创建具体方法​
    public void Message(string message)
    {
        label1.Text = message;
    }
}

 

二、从窗体中定义委托变量 

  主窗体调用从窗体并发送消息:

public partial class FrmMain : Form
{
    FrmOther objFrmOther;

    public FrmMain()
    {
        InitializeComponent();
        objFrmOther = new FrmOther();
        objFrmOther.Show();
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        //[5]调用委托变量传递信息
        objFrmOther.objmessageDele(this.txtMessageSend.Text.Trim().ToString());
    }
}

     从窗体声明委托并实现方法:

public partial class FrmOther : Form
{
    public FrmOther()
    {
        InitializeComponent();

        //[4]委托变量关联方法
        objmessageDele += Message1;
    }

    //[3]创建委托变量
    public MessageDelegate objmessageDele;

    //[2]创建具体方法
    private void Message1(string text)
    {
        lblMessage.Text = text;
    }
}

//[1]声明委托
public delegate void MessageDelegate(string text);

 

  两种方法的实现结果都是差不都的即都是主窗体发送消息然后从窗体接受消息并且显示消息内容。但是委托变量的归属问题却产生了,哪一种方式更应该被推荐使用呢。​

  其实委托的引入就是为了将需要的方法整合到一起,从这个观点来说应该将委托变量和方法放在同一级下即是选用主窗体中定义委托变量毕竟从多方面考虑 如果是多个从窗体接受信息,那么委托的优势在这里也就消失了,由此来看必定是在主窗体中一次将委托变量绑定方法,然后调用的时候只需进行委托变量的调用,如果委托变量放在从窗体中,那么在主窗体中调用每一个从窗体对象的委托时是如此的繁琐,也就失去了委托存在的意义了。

 

三、从窗体向主窗体发送信息​

public partial class Form1 : Form
{
    FrmOther objfrmOther;
    public MessageDele objmessageDele;

    public Form1()
    {
        InitializeComponent();
        objfrmOther = new FrmOther();

        //[4]委托变量绑定方法
        objfrmOther.objMessageDele += showMessage;
        objfrmOther.Show();
    }

    //[2]根据委托创建方法
    public void showMessage(string text)
    {
        this.lblMessage.Text = text;
    }
}

 

四、从窗体中定义委托变量

public partial class FrmOther : Form
{
    public FrmOther()
    {
        InitializeComponent();
    }

    //[3]创建委托变量
    public MessageDele objMessageDele;

    //[5]调用委托实现方法
    private void btnSend_Click(object sender, EventArgs e)
    {
        objMessageDele(this.txtSend.Text.Trim().ToString());
    }
}

//[1]声明委托
public delegate void MessageDele(string text);

   

  这是相对来说比较好的选择,毕竟我们要选择的必定是最优选择,在主窗体中创建委托变量是一种浪费时间的做法,不推荐使用。在这里仅仅是做了委托在窗体通信方面的相关实例,委托其他方面并未涉及,以后的更新中将会出现委托的深一步的运用。​委托在窗体通信方面的应用还是比较热门的,毕竟响应速度比起通过刷新来判断是否有新消息的接入所用的时间少之又少​。

 

转载于:https://www.cnblogs.com/CKExp/p/10520100.html

相关文章:

  • Java编程里的类和对象
  • 计算某个生日是哪个星座的算法
  • this在方法赋值过程中无法保持(隐式丢失)
  • (三)uboot源码分析
  • Swift - 数组排序方法(附样例)
  • Image控件Stretch属性
  • C语言学习笔记--递归函数
  • UML-用例
  • 【Apache大系】Apache服务器面面观
  • MongoDB:实体对象(javabean)转DBObject
  • 关于TCP/IP协议
  • 【Python开发】Python PIL ImageDraw 和ImageFont模块学习
  • CSS学习(一)
  • 问题
  • jquery登录的异步验证
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2019年如何成为全栈工程师?
  • Apache Zeppelin在Apache Trafodion上的可视化
  • gcc介绍及安装
  • Javascript编码规范
  • JavaScript学习总结——原型
  • Java超时控制的实现
  • python3 使用 asyncio 代替线程
  • session共享问题解决方案
  • vuex 学习笔记 01
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 算法之不定期更新(一)(2018-04-12)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ​2021半年盘点,不想你错过的重磅新书
  • #1015 : KMP算法
  • $jQuery 重写Alert样式方法
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)hibernate配置管理
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (力扣)1314.矩阵区域和
  • (七)Knockout 创建自定义绑定
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ./和../以及/和~之间的区别
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET/C# 的字符串暂存池
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET上SQLite的连接
  • @JsonFormat与@DateTimeFormat注解的使用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [Android 13]Input系列--获取触摸窗口
  • [android] 请求码和结果码的作用
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作