比较简单的方法:

一:1.定义两个窗体

2.在父窗体中加入子窗体的属性

  1. public ChildFrm ChildFrm { get; set; }

3.加载的时候:

  1. private void ParentFrm_Load(object sender, EventArgs e)
  2. {
  3. ChildFrm frm = new ChildFrm();
  4. ChildFrm = frm;
  5. frm.Show();
  6. }

4.点击的时候(把子窗体的属性改成公有的):

对象内部的字段或者元素属性最好不要直接让外部直接访问(通过设置的方法来控制)

  1. public System.Windows.Forms.TextBox txtMsg;
  1. ChildFrm.txtMsg.Text = this.txtMsg.Text;

第二种方法:(提供一个方法)

  1. private ChildFrm ChildFrm { get; set; }

子窗体中提供一个方法为:

  1. public void SetText(string txt)
  2. {
  3. this.txtMsg.Text = txt;
  4. }

父窗体点击的时候:

  1. ChildFrm.SetText(this.txtMsg.Text);

第三种:发布订阅模式和观察者模式

父窗体:定义发布消息的委托

  1. public Action<string> AfterMsgSend { get; set; }

委托方式传值

  1. if (AfterMsgSend == null)
  2. {
  3. return;
  4. }
  5.  
  6. AfterMsgSend(this.txtMsg.Text);

子窗体弹出来之前,关注主窗体消息的变化:(委托的方式)

  1. AfterMsgSend += frm.SetText;

第四种方法:(事件的方法)

定义消息发布的事件:

  1. public event EventHandler AfterMsgChangeEvent;

定义一个子类继承EventArgs:

  1. public class TextBoxMsgChangeEventArg :EventArgs
  2. {
  3. public string Text { get; set; }
  4. }

触发事件:

  1. AfterMsgChangeEvent(this, new TextBoxMsgChangeEventArg() { Text = this.txtMsg.Text });

拿到父窗体的传来的文本

  1. public void AfterParentFrmTextChange(object sender, EventArgs e)
  2. {
  3. TextBoxMsgChangeEventArg arg = e as TextBoxMsgChangeEventArg;
  4. this.SetText(arg.Text);
  5. }

事件的方法:

  1. AfterMsgChangeEvent += frm.AfterParentFrmTextChange;

事件和委托的区别:

1.委托是一个类型   事件是委托的特殊实例

2.事件的触发只能在类的内部触发(相对安全)

3.委托实例和事件时有可比性的(委托和事件没有可比性)

发布订阅模式:(一个人发布多个人收到消息)

先定义一个接口:

  1. public interface IChildFrm
  2. {
  3. void SetText(string txt);
  4. }

在父窗体中定义一个子窗体的集合:

  1. public List<IChildFrm> ChildFrmList { get; set; }

子窗体实现接口:

  1. public partial class ChildFrm : Form,IChildFrm

传过来的实体放到当前文本框中:

  1. public void SetText(string txt)
  2. {
  3. this.txtMsg.Text = txt;
  4. }

父窗体循环:

遍历哪个  所有关注消息变化的子窗体的集合    调用集合中每个元素的一个方法

  1. if (ChildFrmList == null)
  2. {
  3. return;
  4. }
  5.  
  6. foreach (var item in ChildFrmList)
  7. {
  8. item.SetText(this.txtMsg.Text);
  9. }

父窗体加载:

  1. private void MainFrm_Load(object sender, EventArgs e)
  2. {
  3. ChildFrm frm = new ChildFrm();
  4.  
  5. this.ChildFrmList = new List<IChildFrm>();
  6.  
  7. this.ChildFrmList.Add(frm);
  8.  
  9. frm.Show();
  10. }

大管家模式:(定义一个MasterFrm)

  1. private void MasterFrm_Load(object sender, EventArgs e)
  2. {
  3. MainFrm mainFrm = new MainFrm();
  4.  
  5. ChildFrm childFrm = new ChildFrm();
  6.  
  7. mainFrm.ChildFrmList = new List<IChildFrm>();
  8. mainFrm.ChildFrmList.Add(childFrm);
  9.  
  10. mainFrm.Show();
  11. childFrm.Show();
  12. }

WinFrm窗体的传值方式的更多相关文章

  1. C#窗体间常用的几种传值方式、以及委托与事件的详细介绍

    窗体间的传值,最好使用委托方式传值,开始之前,我们先来说一下委托与事件的关系. 委托:是一个类. 事件:是委托类型的一个特殊实例,只能在类的内部触发执行. 首先创建2个窗体,这里我们以form1为发送 ...

  2. C# winform窗体间传值(使用委托或事件)

    窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...

  3. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

  4. QT窗体间传值总结之Signal&Slot

    在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...

  5. C#窗体间传值的简便方法/工具

    一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...

  6. 浅谈Asp.Net中的几种传值方式

    一.使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...

  7. asp,net 传值方式 优缺点比较

    .net C#中页面之间传值传参的六种方法 1.QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用 ...

  8. dotNET5的MVC页面传值方式总结

    本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 一.经典回顾 二.Controller向View传值 1. ViewBag ...

  9. 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

随机推荐

  1. javascript实现对象的继承的方式

    在JavaScript将原型链作为实现继承的主要方法.基本原理是利用原型让一个subType引用superType的属性和方法 推荐链接 http://www.jb51.net/article/204 ...

  2. 张艾迪(创始人):发明整个世界+224C个国家

    Eidyzhang:发明整个世界+224C个国家 Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzh ...

  3. android:exported

    这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互.如果设置为true,则能够被调用或交互,否则不能.设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定 ...

  4. 20145236 《Java程序设计》 第十周学习总结

    20145236 <Java程序设计> 第十周学习总结 Java网络编程 Java网络编程技术 Java语言是在网络环境下诞生的,所以Java语言虽然不能说是对于网络编程的支持最好的语言, ...

  5. UB单修改

    FUNCTION Z_SD_UB_CHANGE. *"-------------------------------------------------------------------- ...

  6. 小心buffer的拼接问题 --转

    最近遇见一个从前没有遇见的陷阱,就是data里的chunk拼接. 由于本人身为前端工程师,对buffer的概念实在是认识不足.这次的场景是我要通过http.get去抓取远端的网页文件,很不小心的是对方 ...

  7. js私有共有成员

      在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScr ...

  8. hibernate generator class=xxx id详解

    <id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现.Increment:由hibernate自动递增生成标识符, ...

  9. 使用了Windows Live Writer 写的博客

    <为什么标签不能正确的显示> 重新设置了之后再看看 停用了一些插件! ​ 偶然看到很多Blog都在说:“尝试连接到您的日志时出错:服务器响应无效 – 从日志服务器接收的对 blogger. ...

  10. @property和@synthesize的特性

    基础回顾:get方法和set方法 定义类成员变量时,可以在@interface中定义,也可以在@implementation中定义: 在@interface中声明,成员变量的状态是受保护的,即“@pr ...