zoukankan      html  css  js  c++  java
  • WinForm中窗体间传值(中间类)

    一个稍微复杂一点的程序一般都有两个或者更多的窗体。有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,尤其是用子窗体如何改变父窗体。这个问题已经不少人问过,在群里也为了那种方式好而争论过,昨天雨声.net问窗体间互操作的问题,让我萌生就这个问题写下这篇文章,希望对刚刚接触C#的朋友有所帮助,有疏漏之处,也希望朋友们指正,欢迎讨论。

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,无外乎以下几种方式:

    1. 公共静态变量;
    2. 使用共有属性;
    3. 使用委托与事件;
    4. 通过构造函数把主窗体传递到从窗体中;
    5. 使用中间类。


    前4种方法适用的人比较多,大家也比较熟悉,我这里就不多说了,主要想详细介绍一下第五种,使用中间类的方法。比如从frm1打开frm2,在frm2中把frm1的text值改变为用户输入的字符串,并且关闭frm2。

    首先先定义一个中间对象Observe
    using System;

    namespace demo
    {
    /// <summary>
    /// Observe 的摘要说明。
    /// </summary>
    public class Observe
    {
         private string strText;
         public event EventHandler TextChange;
         public string StrText
         {
          get{return strText;}
          set
          {
           strText = value;
           if(TextChange != null)
            TextChange(this,EventArgs.Empty);
          }
         }
         public Observe()
         {
          //
          // TODO: 在此处添加构造函数逻辑
          //
         }
    }
    }

    在Form2中定义一个Observe成员
         private Observe o_Observer;
         public Observe observe
         {
          set
          {
           this.o_Observer = value;
          }
         }
    在Form2的事件处理中改变o_Observe的StrText
         private void button1_Click(object sender, System.EventArgs e)
         {
          o_Observer.StrText = this.textBox1.Text;
          this.Close();
         }

    在Form1中实例化一个Observer成员
    private Observe o_Observe = new Observe();
    在Form1的事件处理函数中创建Form2的实例,令Form2的observe属性等于Form1的o_Observe并且订阅Observe的事件
         private void button1_Click(object sender, System.EventArgs e)
         {
          Form2 frm = new Form2();
          frm.observe = o_Observe;
          this.o_Observe.TextChange += new EventHandler(o_Observe_TextChange);
          frm.Show();
         }

    这样,Form1知道Form2,Form2不知道Form1

    该技术文章为转载http://lx0319.spaces.live.com/blog/cns!4a2ed078c1f310e8!116.entry

  • 相关阅读:
    Unity Camera属性
    多摄像机同时协作运行
    《未来简史》读书笔记
    Binder学习笔记(十二)—— binder_transaction(...)都干了什么?
    Binder学习笔记(十一)—— 智能指针
    binder学习笔记(十)—— 穿越到驱动层
    Binder学习笔记(九)—— 服务端如何响应Test()请求 ?
    Binder学习笔记(八)—— 客户端如何组织Test()请求 ?
    使用hexo搭建博客并上传GitHub
    Binder学习笔记(七)—— ServiceManager如何响应addService请求
  • 原文地址:https://www.cnblogs.com/pyt5208/p/1182851.html
Copyright © 2011-2022 走看看