热门搜索 :
考研考公
您的当前位置:首页正文

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

来源:伴沃教育
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也是。

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指针指向Form1form2.ShowDialog();

MessageBox.Show(StrValue);//显⽰返回的值

}

Form2中的代码:

private void btnclose_Click(object sender, EventArgs e){

Form1 form1 = (Form1)this.Owner;//把Form2的⽗窗⼝指针赋给lForm1form1.StrValue = \"⼦窗体成功返回值给⽗窗体!\";//使⽤⽗窗⼝指针赋值this.Close();}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top