• 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

     

     

     

  • 相关阅读:
    C# CheckBoxList数据操作(转) 子曰
    extjs获取后台数据(asp.net) 子曰
    PHP学习系列之 环境配置
    Javah生成JNI头文件
    [转] ubuntu 终端命令
    我开博的这一年
    [原]Java web学习系列之 Java web开发中的Hibernate对象关系映射框架
    [原]Java web学习系列之开篇
    [原]android camera中的预览图片变形的解决办法
    [原]Java web学习系列之 Java web开发中数据库连接几种方法
  • 原文地址:https://www.cnblogs.com/myparamita/p/1862543.html
Copyright © 2020-2023  润新知