zoukankan      html  css  js  c++  java
  • windows form之间传值

    在windows form之间传值,大概有四个方法:全局变量、属性、窗体构造函数和delegate。本文以form1和form2之间传值为例。

     

    1.全局变量

    在form1中定义一个public static类型的变量s,在form2中直接以form1.s的形式引用即可。

     

    2.属性

    通过公用一个class来实现,此处以Person类为例,此类只包括age属性,代码如下:

    public class Person
    {
    public int age=0;
    public void changeAge(int _age)
    {
    this.age=_age;
    }
    }
    Form1
    public partial class Form1 : Form
    {
    private Person person;

    public Form1()
    {
    InitializeComponent();
    person
    = new Person();
    Form2 form2
    = new Form2();
    form2.person
    = this.person;
    form2.Show();
    }

    //change age
    private void btnChange_Click(object sender, EventArgs e)
    {
    person.age
    = 1;
    }

    //get age
    private void btnGet_Click(object sender, EventArgs e)
    {
    this.textBox1.Text = person.age.ToString();
    }
    }
    Form2
    public partial class Form2 : Form
    {
    private Person _person;
    public Person person
    {
    get { return _person; }
    set { _person = value; }
    }

    public Form2()
    {
    InitializeComponent();
    }

    private void btnGet_Click(object sender, EventArgs e)
    {
    this.textBox1.Text = _person.age.ToString();
    }

    private void btnChange_Click(object sender, EventArgs e)
    {
    _person.changeAge(
    2);
    }
    }

    无论修改form1/form2中的person 的age值,另外一个的也跟着改变,这是因为两个form引用的是同一个person对象。当我们想在form之间传值时,而且还想让值同步,那么就把这些值作为一个class的属性,传递这个class。

    如果要传递的是一般数据类型(int , string等 ),那么这些数据在form之间是没有联系的,因为C#在定义这些数据类型时,就默认new了他们,例如:int i ; 和int i = new int() 。

    class temp
    {
    int i;
    int[] mm;
    public temp()
    {
    mm
    = new int[10];
    }
    }
    例如上面代码中temp类在form之间传递时,变量i是两个窗体共用的,但是mm 却不是,其原因就是我上面讲的那样,所以利用property的这个特性,我们可以灵活的在form之间传递我们想变和不想变的值。

    3.用含参构造函数:

    在form2中定义含参构造函数,form1中调用传参即可。

     

    4.代理

    在form2中定义代理函数,并通过代理函数传递返回值

    form2
    public delegate void returnValue( int i );
    public returnValue returnTheValue;

    private void button1_Click(object sender, System.EventArgs e)
    {
    if ( returnTheValue != null )
    returnTheValue(
    8 );
    }

    在form1中定义被代理方法,并调用form2中的代理方法

    form1
    private void button1_Click(object sender, System.EventArgs e)
    {
    Form2 temp
    = new Form2( );
    temp.returnTheValue
    = new Form2.returnValue( showValue );
    temp.Show();
    }

    private void showValue( int i )
    {
    textBox1.Text
    = i.ToString();
    }

    点击form2的button,form1中的textbox中的值就会相应变化。

     

    在这四个方法中,

    第一个是双向传值,也就是说,form1和form2改变i的值,另一方也会受到影响。

    第二个方法可以单向也可以双向传值。

    第三个方法是form1->form2单向传值。

    第四个方法是form2->form1单向传值。

     

    参考:http://www.cnblogs.com/njnudt/archive/2007/08/03/841004.html

     

     

     

  • 相关阅读:
    京东精益敏捷教练分享:敏捷助力产品创新!
    设计规范 | 详解组件控件结构体系
    Axure响应式进阶
    通讯录表设计
    TEST1
    c#练习四单元总结
    窗体控件应用总结(1)
    .NET(c#理解)
    test2-11
    test1-1
  • 原文地址:https://www.cnblogs.com/myparamita/p/1862543.html
Copyright © 2011-2022 走看看