惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
博客园 - 叶小钗
F
Fortinet All Blogs
GbyAI
GbyAI
Martin Fowler
Martin Fowler
博客园 - 聂微东
I
InfoQ
B
Blog
IT之家
IT之家
美团技术团队
L
LangChain Blog
小众软件
小众软件
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
Last Week in AI
Last Week in AI
A
About on SuperTechFans
博客园 - Franky
P
Proofpoint News Feed
罗磊的独立博客
月光博客
月光博客
V
Visual Studio Blog
MyScale Blog
MyScale Blog

博客园 - 佚名

SqlCommand执行带GO的SQL脚本文件 TreeList之Extjs篇 XtreTreeList使用扎记(四) TreeList使用扎记(3) XtraTreeList使用扎记(2) TreeView节点快速访问之道 看了感触很深的一个贴子 XtraTreeList使用扎记(1) 勇气宣言 搞笑的段子 特别的一天 C#设计模式读书笔记之合成模式 C#设计模式读书笔记之适配器模式 C#设计模式读书笔记(1) OWC中双刻度图表的实现 男人25岁前必须明白的21个道理!!! 关于Excel中Merge单元格 NET下XML的访问 ADO.NET技术内幕疑点之一
Vs2003多窗口下的复杂数据传递
佚名 · 2006-07-01 · via 博客园 - 佚名

  在多窗口编程中。各个窗口之间的数据传递是件伤神的事情,我以前用的最多的是在一个窗口建立一个公共字段,或创一个公共函数,将窗口的实例传递到下一个窗口,在另外一个窗口中可以对这个公共字段和公共函数进行操作,这样子的实现能满足大部的需求。例如在一个有进度条的操作中,我可以在子窗口中暴露一个对进度条操作的只写属性,每次父窗口改写进度值子窗口都用这个值去更新进度条,实现进度百分比的效果。
  今天在吕老师的Blog上看到了一个新的实现方法。以前的实现方法都是窗口与窗口之间的交换。结合的比较紧密,如果涉及的窗口比较多的话。一方发生更改。那涉及的代码量就比较大了。他的思路是在窗体与窗体之间增加一个中介。这样让窗体间的结合度降低,一旦需求改变,只需要改变中介了。达到了偷懒的目的。中介类的代码如下:
 

using System;

namespace Test
{
   
public delegate void  TextChangedHandler(string s);
    
public class Result
    

        
public string Result1;
        
public string Result2;
        
public event TextChangedHandler TextChanged;
        
public void ChangedText(string s)
        
{
            
if(TextChanged!=null)
            
{
                TextChanged(s);
            }

        }

    }

      
}

这里面定义了一个委托和一个事件,还有两个事件,我们就是通过这个委托和事件达到数据传递的目的的。

这是建立的父窗口,

这是建立的子窗口,我们就在这里改变一些值,然后这些改动会在父窗口中自动的反映出来。

这是父窗口的实现代码

  Result r=new Result();
        
private void button1_Click(object sender, System.EventArgs e)
        
{
            
            r.TextChanged
+=new TextChangedHandler(this.TextChangedEve);
            Form2 frm
=new Form2(r);
            frm.Show();
            

        }


        
private void TextChangedEve(string s)
        
{
          textBox2.Text 
=r.Result1 +r.Result2 ;
           textBox1.Text 
=s;
        }

这代码里我们建立一个对象Result,并给事件订阅了处理程序,然后将Result对象的实例传给了Form2.在Fom2中我们需要重与构造函数,以获得对Result的引用。

 1private Result R;
 2        public Form2(Result r):this()
 3        {
 4          this.R=r;
 5        }

 6        private void button1_Click(object sender, System.EventArgs e)
 7        {
 8            R.Result1=textBox2.Text;
 9            R.Result2 =textBox3.Text;
10            R.ChangedText(textBox1.Text.Trim());
11        }

这里触发了事件。最终结果将在父窗口中反应出来。运行结果: