zoukankan      html  css  js  c++  java
  • WinForm窗体间如何传值的几种方法

    (转)

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:

     

    1. 公共静态变量;
    2. 使用共有属性;
    3. 使用委托与事件;
    4. 通过构造函数把主窗体传递到从窗体中;

     

    一、通过静态变量

    特点:传值是双向的,实现简单

     

    实现代码如下:

    在一个app类中定义一个静态成员value

    public class app

    {

    public static string value;

    }

    在窗体Form1中这样调用

    app.value = "f2"; //给静态成员赋值

    new Form2 ( ).Show ( ); //显示Form2

    在窗体Form2中

    this.Text = app.value; //取回app.value的值

    app.value = "Form2"; //给app.value赋值,以便其他窗体调用

     

    二、公共变量传值

    这种方法就是利用一个公共变量,先把需要的值存放到这个公共变量,然后需要的时候再通过读取该变量的值来使用

    例子

    Form1:

    public static string Form1Value; // 注意,必须申明为static变量

    private void button1_Click(object sender, EventArgs e)

    {

    Form1Value = "来自Form1";

    new Form2().Show();

    }

    Form2:

    private void Form_Load(object sender, EventArgs e)

    {

    MessageBox.Show(Form1.Form1Value);

    }

    这种方式传值,理解和使用上都相对的简单,但是容易让变量串值,比如第一次修改为“a”,而第二次修改为“b”,则有可能本来需要“a”值的结果变成了“b”。

     

    三、静态方法方式访问

    这种方法与传值方法的第一种有些类似,就是将需要被其他窗体访问的方法用static定义,以便其他传递可以直接访问到

    例子

    Form1:

    private void button1_Click(object sender, EventArgs e)

    {

    new Form2().Show();

    }

    public static void FF()

    {

    MessageBox.Show("Form1方法");

    }

    Form2:

    private void Form_Load(object sender, EventArgs e)

    {

    Form1.FF();

    }

    使用这种方法访问其他窗体的方法,在跨窗体上实现方便,但是需要需要访问到控件值则不能直接访问,需要将值先传递给其他窗体,再有窗体传递回来,或者存储在其他变量后对这变量进行访问。

     

    四、通过窗体的公有属性值

    特点:实现简单

     

    实现代码如下:

    在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值

    public string Form2Value

    {

    get

    {

    return this.textBox1.Text;

    }

    set

    {

    this.textBox1.Text = value;

    }

    }

    在窗体Form1中这样调用

    Form2 f2 = new Form2 ( );

    f2.Form2Value = "Ok"; //给Form2的textBox1赋值Ok

    f2.ShowDialog ( );

     

    五、通过窗体的公有属性值和Owner属性

    特点:实现简单,灵活

     

    实现代码如下

    在窗体Form1中

    public int Form1Value = 1;

    Form2 f2 = new Form2 ( );

    f2.ShowDialog ( this ); //把Form1作为Form2的所有者传递给Form2

    在窗体Form2中

    //Form2的所有者是Form1

    Form1 f1 = ( Form1 ) this.Owner;

    //取到Form1的值是1

    MessageBox.Show ( f1.Form1Value .ToString ( ) );

    //给Form1的Form1Value赋值222

    f1.Form1Value = 222;

     

    六、通过窗体的公有属性值和Application.OpenForms属性

    说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中)

     

    实现代码如下

    在窗体Form1中

    public int Form1Value = 1;

    Form2 f2 = new Form2 ( );

    f2.Show ( );

    在窗体Form2中

    string formName = "Form1";

    Form fr = Application.OpenForms [ formName ];

    if ( fr != null )

    {

    Form1 f1 = ( Form1 ) fr;

    //取到Form1的值是1

    MessageBox.Show ( f1.Form1Value.ToString ( ) );

    //给Form1的Form1Value赋值222

    f1.Form1Value = 222;

    }

     

    七、传参式传值

    此方法顾名思义就是将需要的值一参数形式传递给需要值的窗体

    例子

    Form1:

    private void button1_Click(object sender, EventArgs e)

    {

    new Form2("来自Form1").Show();

    }

    Form2:

    public Form2(string value)

    {

    InitializeComponent();

    MessageBox.Show(vaue);

    }

    此种窗体间传值方法明显优与第一种的传值参数,也不会出现串数据现象,但是需要注意修改Form2的构造函数,每个窗体的默认构造函数默认都是无参数的,因此需要去修改构造函数。

     

    八、通过构造函数

    特点:传值是单向的(不可以互相传值),实现简单

     

    实现代码如下:

    在窗体Form2中

    int value1;

    string value2;

    public Form2 ( int value1 , string value2 )

    {

    InitializeComponent ( );

    this.value1 = value1;

    this.value2 = value2;

    }

    在窗体Form1中这样调用

    new Form2 ( 111 , "222" ).Show ( ); //这样就把111,"222",这2个值传送给了Form2

     

    九、用委托来实现。

    委托可以把一个方法作为参数带入另一个方法,在窗体传值中,子窗体需要执行一个方法来改变父窗体的值,

    而这个方法,则可以用委托从父窗体传递过来。在父窗体中,声明修改文本框的方法AfterChildChange,在new一个子窗体的时候,将这个方法传递给子窗体。那么当子窗体点击同步按钮时,会执行父窗体的AfterChildChange方法,已达到修改文本框值的目的。

     

    例子

    1、在子窗体中设置一个委托类型的属性:

    public Action<string> AfterChangeTextDel { get; set; }

    2、在子窗体同步按钮中:

    if (AfterChangeTextDel != null)
    {
    AfterChangeTextDel(this.textBox1.Text);//执行委托
    }

    3、在父窗体中添加方法:

    public void AfterChildChange(string text)
    {
    txtName.Text = text;
    }

    4、在父窗体启动子窗体按钮:

    ChildFrm frm =new ChildFrm();

    frm.AfterChangeTextDel = new Action<string>(this.AfterChildChange);

    frm.Show();

    5、这样也能实现窗体传值,子窗体的委托可以在父窗体 其他地方可以进行直接执行。:解决此问题。微软引入了事件。

     

    十、用事件来实现

    事件是委托类型的对象。它内部是用委托来实现的,对于事件来说,外部只能注册自己+=,注销自己-=,外界不可以注销其他的注册者,也不能主动触发事件。而委托则无法实现这些控制,因此诞生了事件这话总语法。

     

    实现代码如下

    在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值

    并且还定义一个accept事件

    public string Form2Value

    {

    get

    {

    return this.textBox1.Text;

    }

    set

    {

    this.textBox1.Text = value;

    }

    }

    public event EventHandler accept;

     

    private void button1_Click ( object sender , EventArgs e )

    {

    if ( accept != null )

    {

    accept ( this , EventArgs.Empty ); //当窗体触发事件,传递自身引用

    }

    }

    在窗体Form1中

    Form2 f2 = new Form2 ( );

    f2.accept += new EventHandler ( f2_accept );

    f2.Show ( );

    void f2_accept ( object sender , EventArgs e )

    {

    //事件的接收者通过一个简单的类型转换得到Form2的引用

    Form2 f2 = (Form2) sender;

    //接收到Form2的textBox1.Text

    this.textBox1.Text = f2.Form2Value;

    }

  • 相关阅读:
    poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)
    poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
    poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)
    hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)
    hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
    Gym 100512F Funny Game (博弈+数论)
    UVa 12714 Two Points Revisited (水题,计算几何)
    UVa 12717 Fiasco (BFS模拟)
    UVa 12718 Dromicpalin Substrings (暴力)
    UVa 12716 && UVaLive 6657 GCD XOR (数论)
  • 原文地址:https://www.cnblogs.com/aresyl/p/3784220.html
Copyright © 2011-2022 走看看