Winform开发之窗体传值
Winform的窗体之间的数据传递是开发的必备技术,下面介绍几种典型的传值方法
1、构造函数传值,但这种方法是单向的(推荐)
上代码,先传值
1 private void button2_Click(object sender, EventArgs e) 2 { 3 Form3 fr3 = new Form3("要传的值啊"); 4 fr3.ShowDialog(); 5 }
接值,对了,这里需要重载一个Form3的构造函数,然后将拿到的值显示出来
1 public Form3(string canshu) 2 { 3 InitializeComponent(); 4 label1.Text = canshu; 5 }
效果图,就是这么简单
2、静态变量传值(不推荐)
可以将静态变量申明在你需要的地方,比如一个单独类,或者Form中,比如我们在这里申明在Form2中
public static string xvalue;
1 private void button2_Click(object sender, EventArgs e) 2 { 3 xvalue = "要传的值啊xvalue"; 4 Form3 fr3 = new Form3(); 5 fr3.ShowDialog(); 6 }
先给赋值,然后在Form3中取值
1 public Form3() 2 { 3 InitializeComponent(); 4 label1.Text = Form2.xvalue;//Form2实际也是个class,直接取静态值即可,如果静态变量xvalue定义在其他类中,即将Form2替换即可 5 }
效果图上
3、通过共有属性传值
首先在要打开的Form中创建一个共有属性,然后在调用窗口赋值即可。比如下面Form2启动Form3,即给Form3的yvalue传值
(1)在Form3中定义共有属性
1 public string yvalue { 2 get 3 { 4 return label1.Text.ToString(); 5 } 6 set 7 { 8 label1.Text = value; 9 } 10 }
(2)Form2中启动Form3,并传值
1 private void button2_Click(object sender, EventArgs e) 2 { 3 Form3 fr3 = new Form3(); 4 fr3.yvalue = "要传的值啊"; 5 fr3.ShowDialog(); 6 }
4、通过Owner属性传值
(1)在调用者Form2中申明一个公有变量,并赋值,设置需要启动的Form3的Owner
1 public string xvalue; 2 private void button2_Click(object sender, EventArgs e) 3 { 4 xvalue = "Form2要传的值"; 5 Form3 fr3 = new Form3(); 6 fr3.Owner = this; 7 fr3.ShowDialog(); 8 }
(2)启动窗体Form3中取值
1 private void Form3_Load(object sender, EventArgs e) 2 { 3 Form2 fr2 = (Form2)this.Owner; 4 label1.Text = fr2.xvalue; 5 }
这种方法实际是将Form2传给了Form3,因此Form3可以取到Form2的所有公有变量和属性。
5、委托传值(推荐)
委托传值主要用在子窗体给父窗体传值上,即上文的Form3给Form2传值
(1)先在Form3中申明委托
1 public delegate void PutHandler(string text); 2 public PutHandler putTextHandler;//委托对象 3 private void button1_Click(object sender, EventArgs e) 4 { 5 if (putTextHandler != null) 6 { 7 putTextHandler(textBox1.Text.ToString()); 8 } 9 }
(2)在Form2中绑定委托事件
1 public void getValue(string strV) 2 { 3 this.textBox1.Text = strV; 4 } 5 6 private void button1_Click(object sender, EventArgs e) 7 { 8 Form3 fr3 = new Form3(); 9 fr3.putTextHandler = getValue; 10 fr3.ShowDialog(); 11 }
注意:
if (putTextHandler != null)
{
putTextHandler(textBox1.Text.ToString());
}
上面这样做是有bug的。
最好的做法是,是先用临时变量缓存putTextHandler ;
然后在处理,
否则你判断!=null成立
但是马上在其他地方-=的话,程序就出错了
-=你是不知道会由谁调用的