小菜学习Winform(五)窗体间传递数据
前言
做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式。
共有字段传递
共有字段传递实现起来很方便,就是在窗体类中加个共有字段属性:
1 public string Msg 2 { 3 get 4 { 5 return this.textBox1.Text.Trim(); 6 } 7 }
调用代码:
1 public Form2(Form1 f1) 2 { 3 InitializeComponent(); 4 this.label1.Text = f1.Msg; 5 }
就这么简单,共有字段传递其实只是一种可以传递数据的方式,但不希望采用这种方式,除非一些窗体是要做传值的,比如一些信息弹窗,可以采用这种方式。
构造传递
构造传递一般是我们做项目常用的一种,就像对象传值一样,我们只要在构造方法中添加参数即可。
1 public Form2(string msg) 2 { 3 InitializeComponent(); 4 this.label1.Text = msg; 5 } 6 7 private void button1_Click(object sender, EventArgs e) 8 { 9 Form2 f2 = new Form2(this.textBox1.Text.Trim()); //调用 10 f2.Show(); 11 }
委托与事件传递
上面说的两种方式都是由父窗体传值给子窗体,还有一种方式是子窗体传值给子船体,这种方式一般采用委托和事件传递,我们来做个示例看下。
我们先建一个委托,参数是string:
1 public delegate void selectChangedHandler(string s);
在传值中我们需要第二种方式来传递一个对象集合,首先我们建一个数据传递集合:
1 public class CallObject 2 { 3 public string callMessage = ""; 4 public event selectChangedHandler selectChangedEvent; 5 6 public void callEvent(string s) 7 { 8 this.selectChangedEvent(s); 9 } 10 }
集合包含两个部分,一个是返回信息对象,一个是事件对象,这些其实以便子窗体调用来得到从子窗体中传递过来的数据,事件定义好了就得有事件处理方法:
1 public void co_selectChangedEvent(string s) 2 { 3 this.txtF2Select.Text = s; 4 }
我们看下父窗体的调用方法:
1 private void btnCallForm2_Click(object sender, EventArgs e) 2 { 3 CallObject co = new CallObject(); 4 co.selectChangedEvent+=new selectChangedHandler(co_selectChangedEvent); 5 Form2 f2 = new Form2(co); 6 7 f2.ShowDialog(); 8 txtEventResult.Text = "Form2传的信息:" + co.callMessage; 9 }
这边主要是给事件注册,从父窗体中我们就可以推断出,子窗体是怎么调用的,通过构造方法得到对象集合,然后触发事件就可以了。
1 private CallObject co; 2 public Form2(CallObject cov):this() 3 { 4 this.co = cov; 5 } 6 7 private void rb_A_CheckedChanged(object sender, EventArgs e) 8 { 9 co.callEvent("A"); 10 }
运行效果:
下面传值给父窗体的值需要关闭子窗体,父窗体再可以得到,上面的可以实时传递。
程序下载:窗体间传递数据.rar
后记
其实上面第一种并不能说是一种好的方式,就像说模式,常用并且可以解决问题的解决方案称为模式,开门有几种方式:拿钥匙开门和撬门,我们常用的是第一种,并称为一种开门模式,并不是说第二种就不是了,只不过我们不常用,适合一些特殊的情况,比如,忘记拿钥匙了,就是这个意思。
作者:田园里的蟋蟀
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分类:
[15]Winform
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架