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

C#利用委托实现多个窗体间的传值

原文链接:https://zhuanlan.zhihu.com/p/559679569

要实现这样一个功能:父窗体创建了两个子窗体,子窗体1和子窗体2,1产生的数据要在2中显示出来。 因为这两个子窗体本身之间并没有直接关联,他们都是由父窗体new出来的,所以就想着1的数据先发给父窗体,父窗体再发给2。这样结构上比较清晰,也符合松耦合的模式。结构如下:

f6cafb4475d2ef44ba2fdc40d3340ce6_v2-d3270d717b694e5c7291cab84068c6e0_1440w

 窗体间数据传递的方法有多种,这里我们直接选择最被推荐的方法:委托(delegate)和事件(event)。

子窗体1发送消息给父窗体

在子窗体1中定义一个委托

public delegate void SendMsg(string msg);

再定义一个事件

public event SendMsg send;

点击发送按钮时,触发事件 

private void button1_Click(objectsender,EventArgse){  send(textBox1.Text); 
}

 完整代码 

public partial class Form_Child1:Form 
{public delegate void SendMsg(string msg); public event SendMsgsend; public Form_Child1() {InitializeComponent();} private  void  button1_Click(objectsender,EventArgse) { send(textBox1.Text); } 
}

  委托可以理解为方法的代理,当我需要调用方法时可以直接调用委托,而事件是绑定到委托上的。当事件被触发,就会运行我们最终想要执行的方法。

     上面子窗体1已经注册好了委托和事件,接下来需要父窗体订阅该事件。

    

private  Form_Child1  form_Child1;
public  Form1() 
{ 
InitializeComponent(); form_Child1=newForm_Child1();//实例化子窗体1 
form_Child1.send+=newForm_Child1.SendMsg(receiveChild1Msg);//订阅子窗体1的send事件 //也可以简写成如下格式 //form_Child1.send+=receiveChild1Msg; }

  其中receiveChild1Msg是委托代理的方法,也就是要最终执行的方法,需要定义并实现

private void receiveChild1Msg(string msg) 
{ transfer(msg);//此处写具体要做的事情 
}

  因为父窗体接收到子窗体1的消息后要转发给子窗体2,所以我们这里transfer(msg)做的事情就是把信息再转发出去,具体见后面解析。

父窗体转发消息给子窗体2

这回等于是父窗体给子窗体发消息,所以我们在父窗体中定义委托和事件,然后让子窗体2去订阅,代码如下,我们先去掉关于窗体1的那部分以方便观察。

private Form_Child2 form_Child2;
public delegate void TransferMsg(string msg);//定义转发消息的委托 
public event TransferMsg transfer;//定义事件 
public Form1() 
{ 
InitializeComponent(); 
form_Child2=newForm_Child2();//实例化子窗体2 
transfer+=newTransferMsg(form_Child2.getMsg);//子窗体2订阅transfer事件 //也可以简写成如下格式 //transfer=form_Child2.getMsg; }

  所以上面父窗体接收到子窗体1消息后的那个transfer(msg)就是为了触发transfer事件。这时候transfer事件被触发,子窗体2中的getMsg就会被执行

public void getMsg(string str) 
{BeginInvoke(newMethodInvoker(delegate{ listBox2.Items.Add(str); })); 
}

  信息就被接收到了,这样就完成了整个消息的传递过程。

效果:

356854c45eaf7ed5c6573310277a3108_v2-a4103b7ae1681b959a2cb4ba2c987cf1_b

 

  

http://www.hskmm.com/?act=detail&tid=28762

相关文章:

  • 2025常州微弧氧化批发厂家最新推荐榜:技术领先与优质服务双
  • new操作符的手动实现
  • JS使用Regex校验出现卡顿
  • 2025舒适轮胎厂家最新推荐榜:静音耐磨,驾驶体验再升级!
  • 2025 净化铝型材十大品牌之一优选,推荐龙新铝业,最快24小时内发货
  • 手写Promise
  • 双列集合
  • 二项式反演
  • 2025 权威推荐!净化铝型材品牌 TOP5 排行榜:实力厂家精选,品质之选不容错过
  • 关于HashMap
  • sar(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一。
  • 车辆主动悬架线性最优控制(LQR)系统
  • 2025环保/植物/净醛/健康/无味腻子粉厂家推荐榜:专注多场景墙面基底解决方案供应!
  • 2025 泰国立体/高位/仓储/托盘/重型/流利式/贯通式/穿梭车/模具货架厂家推荐排行榜:聚焦多场景存储需求,精选优质供应商!
  • 2025 工控/核心板/工业/嵌入式主板板卡厂家推荐排行榜:聚焦多领域智能硬件核心供应!
  • 计划任务在不管用户是否登录都要运行时,bat不能正常运行处理办法
  • 2025 高压/高压空气/氦气/氩气压缩机厂家推荐榜:聚焦多场景压缩空气解决方案!
  • 2025 温室/蔬菜/花卉/单栋/玻璃温室/连栋/连栋膜温室/薄膜/塑料/钢架大棚厂家推荐榜:聚焦多场景种植需求,提供专业设施解决方案!
  • Delta并联机器人正逆解实现
  • SQL查询,直接生成json结果
  • 2025 MVR/三效/多效/结晶/废水/降膜蒸发器厂家口碑推荐榜:聚焦多行业废水处理与物料浓缩解决方案!
  • mindie开启DeepSeek的128K
  • MATLAB的无刷直流电机转速电流双闭环仿真实现
  • AI设计软件/工具/品牌/方案/大模型/开源模型/平台/小程序/插件公司推荐:专注多场景智能设计解决方案供应!
  • STM32环境配备keil5【保姆级】
  • 微波雷达模块让广告灯告别无效展示
  • 2025七水硫酸锌供货厂家最新推荐榜:品质稳定与高效服务的优
  • 从 1 到 1000:MyEMS 社区如何用开源力量搭建中小企业的 “零碳工具箱”?
  • 为什么你的项目总是延期?90%的团队忽略了这5个预警信号
  • 变量、常量和作用域