C#实现Winform间的数据交互的三种方法

 

    使用.NET编写winform程序,比较常见的一种情况就是如何实现Form间的数据交互,下面就简单总结一下常见的几种数据交互方式:

 

    (1)修改子窗体的构造函数:简单地说就是通过修改子窗体Form的构造函数,如下所示:


            public Form2(string Para1, ArrayList List1, TextBox textBox1, Form Form1)
            {
                    InitializeComponent();
            }

   
            上面的例子中,为子窗体Form2添加了4个参数,分别是:字符串Para1,字符数组List1,文本控件textBox1和父
        窗体Form1,下面简单区分一下它们各自的特点:


        <1> 字符串:单向的值传递,在子窗体中不能通过修改此参数的值来间接改变父窗体中的数据。
        <2> 字符数组:引用型传递,可以通过将父子窗体中不同的成员变量指向相同的数组,即可实现变更一方,同时更新
            对方的数据。
        <3> 控件: 引用型传递,可以通过修改该控件的数据来直接达到控制父窗体中该控件数据的目的。
        <4> 窗体: 这个最直接,直接将父窗体传递到子窗体中,我们可以方便地在子窗体中修改父窗体中所有授权为public
            的数据。

 

    (2)给窗体添加属性或方法:
            获取或设置拥有此窗体的窗体。若要使某窗体归另一个窗体所有,请为其 Owner 属性分配一个对将成为所有者的
        窗体的引用。当一个窗体归另一窗体所有时,它便随着所有者窗体最小化和关闭。例如,如果 Form2 归窗体 Form1
        所有,则关闭或最小化 Form1 时,也会关闭或最小化 Form2。并且附属窗体从不显示在其所有者窗体后面。可以将附
        属窗体用于查找和替换窗口之类的窗口,当选定所有者窗体时,这些窗口不应消失。若要确定某父窗体拥有的窗体,
        请使用OwnedForms属性。
            我们可以通过下面的方式来确定这种从属的窗体关系:


                Form2 form = new Form2();
                form.Owner = this;
                form.ShowDialog();
                或者
                Form2 form = new Form2();
                form.ShowDialog(this);

 

            定了从属关系以后,我们就可以通过在Form的load事件中或者通过定义public的属性或者方法来彼此进行数据修
        改操作,简单操作如下:


                Form1 pareForm = (Form1)this.Owner;   
                this.listData1 = pareForm.ListData2;

 

     (3)通过委托的方法:
          相对以上两种方法来说,这种方法可能较复杂一些,但基本思路是一样的,需要修改的地方如下:


            <1> 在Form2.cs中添加委托函数定义:public delegate void SendFun(string str);
            <2> 在Form2.cs中添加委托示例:public event SendFun SendToParent;
            <3> 在Form2.cs中添加一个按钮,并添加其事件如下:
                private void button1_Click(object sender, EventArgs e)
                {
                    if (Send != null)
                    {
                        Send(this.textBox1.Text);
                    }
                }

 


            <4> 在Form1.cs中添加方法RecvInfo()方法如下:
                private void RecvInfo (string str)
                {
                    textBox1.Text = str;
                }


            <5> 在Form1.Designer.cs中的InitializeComponent()方法中添加委托实例定义:
                this.myForm.Send += new Example3_Form2. SendFun (RecvInfo);

 

        通过上面五步操作,即可达到Form间的通信的目的。希望这个总结能够对大家有所帮助。

 

 

一.使用带参数的构造函数  
    我们要做的准备工作就是新建两个窗体  
 
 
<第一个例子>  
 
说明:Form1为主窗体,包含控件:文本框textBoxFrm1,多选框checkBoxFrm1和按钮buttonEdit;  
 
Form2为子窗体,包含控件:文本框textBoxFrm2,多选框checkBoxFrm2和按钮buttonOK,buttonCancel。  
 
 
当我们新建一个窗体的时候,设计器会生成默认的构造函数:  
 
public Form2()  
 
{  
 
     InitializeComponent();  
 
}  
 
它不带参数,既然我们要把Form1中的一些数据传到Form2中去,为什么不在Form2的构造函数里做文章呢?  
 
假设我们要实现使Form2中的文本框显示Form1里textBoxFrm1的值,修改子窗体的构造函数:  
 
public Form2(string text)  
 
{  
 
     InitializeComponent();  
 
     this.textBoxFrm2.Text = text;  
 
}  
 
增加Form1中的修改按钮点击事件,处理函数如下:  
 
private void buttonEdit_Click(object sender, System.EventArgs e)  
 
{  
 
     Form2 formChild = new Form2(this.textBoxFrm1.Text);  
 
     formChild.Show();  
 
}  
 
我们把this.textBoxFrm1.Text作为参数传到子窗体构造函数,以非模式方式打开,这样打开的formChild的文本框就显示了”主窗体”文本,是不是很简单,接下来我们传一个boolean数据给子窗体。  
 
Public Form2(string text,bool checkedValue)  
 
{  
 
     InitializeComponent();  
 
     this.textBoxFrm2.Text = text;  
 
     this.checkBoxFrm2.Checked = checkedValue;  
 
}  
 
在主窗体中的修改按钮点击处理,我采用了打开模式窗口的方式,其实在这个例子中看不出有什么分别,  
 
private void buttonEdit_Click(object sender, System.EventArgs e)  
 
{  
 
     Form2 formChild = new Form2(this.textBoxFrm1.Text,this.checkBoxFrm1.Checked);  
 
     formChild.ShowDialog();  
 
}  
 
结果在预料之中,但是这里明显存在不足,在子窗体里的数据修改后不能传给主窗体,也就是说主窗体不受子窗体的影响。而在实际的开发过程中我们经常使用子窗体来修改主窗体里面的数据,那怎么解决呢?  
 
     在.NET中有两种类型,值类型和引用类型。值类型是从ValueType继承而来,而ValueType又是从Object继承;对于引用类型它直接继承Object类型。这下让我们看看怎样通过Form2来修改Form1里的数据。  
 
还是让我们来修改Form2的代码。  
 
Private TextBox textBoxFrm12;  
 
private CheckBox checkBoxFrm12;  
 
public Form2(TextBox heckbo,CheckBox heckbox)  
 
{  
 
     InitializeComponent();  
 
     this.textBoxFrm2.Text = heckbo.Text;  
 
     this.checkBoxFrm2.Checked = heckbox.Checked;  
 
     this.textBoxFrm12 = heckbo;  
 
     this.checkBoxFrm12 = heckbox;  
 
}  
 
现在我们传了两个引用类型的数据:TextBox类型,和CheckBox;另外在Form2中增加了两个类数据成员textBoxFrm12、checkBoxFrm12用来分别保存构造函数传来的变量,不过他们并不属于Form2的Controls容器。修改Form2的确定按钮点击事件函数:  
 
private void buttonOK_Click(object sender, System.EventArgs e)  
 
{  
 
     this.textBoxFrm12.Text = this.textBoxFrm2.Text;  
 
     this.checkBoxFrm12.Checked = this.checkBoxFrm2.Checked;  
 
     this.Close();  
 
}  
 
上面的代码我们通过把textBoxFrm2的Text和checkBoxFrm2.Checked赋给textBoxFrm12和checkBoxFrm12完成了对主窗体中的textBoxFrm1和checkBoxFrm2的修改,因为textBoxFrm1和textBoxFrm12是同一个引用,而checkBoxFrm2和checkBoxFrm12也是。  
 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abcdef1111111/archive/2009/08/21/4469937.aspx

 

 

 

3 父窗口传值给子窗口(Form1为主窗体,Form2为子窗体)

Form1中的代码:
private string strValue;

public string StrValue
{
get { return strValue; }
set { strValue = value; }
}
private void btnShow_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();

//子窗体返回值给父窗体
form2.Owner = this;;//重要的一步,主要是使Form2的Owner指针指向Form1

form2.ShowDialog();
MessageBox.Show(StrValue);//显示返回的值

}
Form2中的代码:
private void btnclose_Click(object sender, EventArgs e)
{
Form1 form1 = (Form1)this.Owner;//把Form2的父窗口指针赋给lForm1
form1.StrValue = "子窗体成功返回值给父窗体!";//使用父窗口指针赋值

this.Close();
}

posted @ 2010-03-05 12:02  Blink_Star  阅读(3328)  评论(0编辑  收藏  举报