开发C#程序,除了实现具体的功能后,我相信最多的也是程序内的数据的交流。而对于窗体间的数据的传递就是这些信息交流最简单,最基础的功能.
比如,在窗体A上有一个数值:a,要传递给窗体B,那怎么办呢?或者说要把窗体B上的某一个数值传递给窗体A,那又怎么办呢?假如你不会,那就要学习本教程了。本教程就是为了解决这个问题而写的。相信在学会后,对程序的开发速度及质量将产生积极的推动作用。
我始终坚信:会者不难,难者不会。只要你学会了,你就会感觉到原来这么的简单。
最近从网上,也找到一些这方面的内容,基本上都差不多,但是看得却是云里雾里的。所以本人决定从重整理,希望能对初学者有所帮助。当然也要感谢网友的无私共享. (Jene Marlin)
数值传递方法(一):
这是一个最简单的方法,相信你看过后,就能使用。利用属性来传递数值。这种方法主要用于少量的数值传递。比如:要把窗体A的数据传递给窗体B,那就要在窗体A中,建立一个属性。在窗体B上,要进行获取窗体上的数据,就要引用窗体上的这个属性即可。(注意:是在窗体B上,进行操作。)当然也可以反过来:在窗体B上,建立属性,在窗体A操作,来获取窗体B上的数据。Form1中放一个Label1,一个Button1,Form1为主窗口,当点击Button1时,执行:Form2 f2 = new Form2();f2.ShowDialog(this);
Form2中放一个TextBox1,一个Button1,当点击Button1时执行:Form1 f1 = (Form1)this.Owner;f1.Label1.Text = this.TextBox1.Text;
注意:Form1中的label1要设为public
当然你也可以根据需要来自定义属性。比如在窗体A上建立属性,并给这个属性赋值后,就能被后面所使用。private string strValueA;//这是一个变量,在内存中分配的地址。public string StrValueA//这是所声明的属性{ get{ return strValueA; } //当你需要这个值时,得到这个属性的值。 Set { strValueA = value;}//给这个属性赋值} 假如在窗体B上,要得到窗体A上的那个属性时,就可以使用前面所讲的方法来传递数值。
数值传递方法(二):
从上面的《数值传递方法(一)》中,我们已经可以用最简单的方法来进行数据的传递。本节将在前面的利用属性传递的基础上,进行进一步的探讨。而所使用的是就是程序中最常用的方法。 其实说,利用方法来进行数值的传递,它的背后也是借住了属性传递的条件,才进行的。但是这种方法用于要进行修改或是刷新数值比较多时,才会使用。 比如:在窗体A上打开的基础上,又打开了窗体B,而在窗体B上,重新刷新窗体A上的数值,需要这样做:在窗体A上,新建一个方法,方法将对数据传递的这个过程里程操作。或者说是把数据传递这个过程写到了一个通用的方法里,所以具体还是要参考属性的数值传递。
public void Refresh_Method() { //属性数值传递 } 数值传递方法(三): 利用静态属性,方法,变量来进行数值的传递。我们都知道,静态方法或是属性,都是不需要进行实例化就能使用的。而前面介绍的都是要对对象进行实例化后才能使用的。所以说这种更简单。这种方法同前面的利用属性进行数值传递原理一样,但是还要简单一些。 静态属性 Public static string a//声明静态属性同正常的属性 { // } Public static void aa()//静态方法同正常的方法 { // } 数值传递方法(四): 使用带参数的构造函数,但是这种方法也存在着不足之处,那就是只能刷新一个窗体---------子窗体的数据。对于父窗体就无能为力了。 说明: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(); } 结果在预料之中,但是这里明显存在不足,在子窗体里的数据修改后不能传给主窗体,也就是说主窗体不受子窗体的影响。而在实际的开发过程中我们经常使用子窗体来修改主窗体里面的数据。
