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成立
但是马上在其他地方-=的话,程序就出错了
-=你是不知道会由谁调用的
原文地址:https://www.cnblogs.com/SJP666/p/4810114.html