本人常用的WinForm窗口间传递数据的方式

同学问我:

有两个窗体,1和2,在1中点击查询之后弹出窗体2,在2中输入查询条件,在1中显示查询结果,怎么样才能在窗体1中显示查询结果;我的做法是通过构造函数传值,你怎么做

由此得来此文…不说废话了…:
20130524151912

 

首先是Show窗体的主要代码:

/// <summary>
///     公共方法
/// </summary>
/// <param name="str" type="string">
///     <para>
///         需要设置在文本框中的字符串
///     </para>
/// </param>
public void Edit(string str)
{
    this.textBox1.Text = str;
}

private void btnEdit2_Click(object sender, EventArgs e)
{
    new Edit().ShowDialog();
}

private void btnEdit1_Click(object sender, EventArgs e)
{
    new Edit(this).ShowDialog();
}

然后是Edit窗体的主要代码:

Form form;
public Edit(Form form)
{
    InitializeComponent();
    this.form = form;
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        if (form != null)
        { //第一种方式
            (form as Main).Edit(this.textBox1.Text);
        }
        else
        { //第二种方式
            //对象必须已经实例化
            if (Application.OpenForms["Main"] != null)
                //调用Main窗体中的Edit方法
                (Application.OpenForms["Main"] as Main).Edit(this.textBox1.Text);
        }
        this.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

两种方式的共同点在于,需要数据的窗体必须含有一个公共的方法才可以.

先说第一种,给Edit窗体增加了一个构造函数

public Edit(Form form)
{
  InitializeComponent();
  this.form = form;
}

也就是传递窗体引用来对Show窗体进行交互(这里传递的类型是窗体的父类Form

需要传值是仅需调用其窗体对象的方法即可即可:

(form as Main).Edit(this.textBox1.Text);

第二种方式是使用Application中的OpenForms属性来获取已经打开的窗体对象(我个人喜欢使用这种方式)

但是该窗体必须要存在,也就是不为null:

if (Application.OpenForms["Main"] != null)
  //调用Main窗体中的Edit方法
  (Application.OpenForms["Main"] as Main).Edit(this.textBox1.Text);

[download id=”53″]
[buy]使用的VS2012,.NetFr4.0没有安装的就直接看代码把….
另外还可以使用静态字段来传递,但是个人感觉这种方式比较麻烦.[/buy]

12 Replies to “本人常用的WinForm窗口间传递数据的方式”

      1. 观察者模式一种设计模式。所有的设计模式都是通过接口多态..blabla什么实现的。观察者的设想,用现实打比方就是,搞一块黑板,两个人(Class)都可以往里面写东西,然后互相无法看见对方人,但可以看到黑板,然后一个人写到黑板的时候,黑板通知别人信息有变化blabla神马的。wikipedia还是比较靠谱滴https://zh.wikipedia.org/wiki/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F#C.23

        1. 中午的时候,在QQ群里讨论过这个…以下是聊天记录:Ovear 13:46:57 观察者很好用啊『❀』海棠不惜胭脂色(1912107736) 13:47:28 关键是,没有想清楚在哪用Ovear 13:47:51 女神.增加备胎(屌丝1)女神.增加备胎(屌丝2)女神.增加备胎(屌丝3)女神.增加备胎(屌丝4)女神.增加备胎(屌丝5)女神.发布消息(“我想吃冰激凌了”)『❀』海棠不惜胭脂色(1912107736) 13:48:06 我明白了…!!!!!!!Ovear 13:48:34 屌丝1.notifly()this.目的地=小商店this.动作=买冰激凌Ovear 13:48:53 屌丝2.notifythis.目的地=女神家this.动作=接女神Ovear 13:49:02 屌丝3.notifly***************Ovear 13:49:23 这就是作用23333『❀』海棠不惜胭脂色(1912107736) 13:50:42 三千院の暗 Ծ‸Ծ 13:50:46 屌丝1 孤独一生

      2. “C#和其他使用.NET Framework的語言一般無需使用接口和類實現典型的觀察者模式,。。。” via Wikipedia无语。。。。不明白C#的神奇

          1. 还有人要求白宫承认咸的豆腐脑才是正宗的豆腐脑呢表示考虑了好久,正打算签个,结果过期了只是说,签名到了一定的个数–貌似是10W白宫被要求必须对此做出回应

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据