对于Form窗体之间的传值,如果要将值从Form1传到Form2中,最简单的就是在Form2中声明一个公有变量,然后在Form1中实例化Form2,然后调用Form2的公有变量:
(1)首先在Form2中声明一个共有变量:
public string str = null;
(2)然后在Form1中实例化Form2窗体:
public Form2 form2= new Form2();
(3)在Form1窗体中直接或者在按钮中将值传给Form2:
if (form2 == null || form2.IsDisposed) { form2 = new Form2(); } form2.str = "窗体1的值";
这种方式适合从父窗体传值到子窗体,如果是要继续将子窗体的值传回给父窗体,这种实例化一个窗体然后传值的方式不太适用,因为如果是在子窗体中实例化父窗体,就相当于是新建了一个窗体,这样就没有办法实现在原来的父窗体中显示值。用委托进行传值可以很好的解决这个问题,首先在namespace(命名空间)中声明public型委托,然后在子窗体中声明一个委托事件,在子窗体中调用委托事件,然后在父窗体中实例化子窗体,对子窗体中调用的委托事件进行事件绑定,最终实现了将子窗体中的值传到父窗体:
(1)声明委托:
public delegate void TranValue(double value);
(2)在子窗体类中声明委托事件:
public event TranValue tranvalue;
(3)在子窗体中调用委托事件:
double value; tranvalue(value);
(4)在父窗体中实例化子窗体,绑定委托事件:
public Form2 form2= new Form2(); private void DisplayToolStripMenuItem_Click(object sender, EventArgs e) { if (form2== null || form2.IsDisposed) { form2= new Form2(); } form2.shuishen += form2_tranvalue; form2.Show(); } /// <summary> /// 委托绑定事件,让Textbox显示子窗体传进来的值 /// </summary> /// <param name="Height"></param> void form2_tranvalue(string value) { Textbox.Text = value; }
补充:两种方法都只能是单向传值,第一种适合将值从父窗体传给子窗体,第二种适合将值从子窗体传回父窗体。第二种方法如果是将值从父窗体传回子窗体还需要子子窗体中实例化父窗体,而且还是绑定父窗体的事件,这种方法不太适合父窗体传给子窗体。