C#跨窗体传递值

在我们实际的项目工程中,窗体之间往往需要数据的传递,本次通过学习网友发的帖子,了解了值传递的方法,现写下来。

窗体之间值的传递方式有很多种,本文只讲三种:控件属性访问、普通委托事件访问、泛型委托Action访问

第一种:

首先新建一个winform窗体form1,再添加一个窗体form2,在窗体1添加一个textbox1和button1,在窗体2添加一个textbox2和button2。如图

C#跨窗体传递值_第1张图片     C#跨窗体传递值_第2张图片

在窗体2中添加如下代码:

 1  public partial class Form2 : Form
 2     {
 3         public Form2()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8 
 9         /// 
10         /// 将外部不可访问的textbox4.Text封装成属性TextBox2Value
11         /// 
12         public string TextBox2Value
13         {
14             set { textBox4.Text = value; }
15             get { return textBox4.Text; }
16         }
17         private void button1_Click(object sender, EventArgs e)
18         {
19             this.DialogResult = DialogResult.OK;//这里的DialogResult是form2类对象的属性
20         }
21     }
View Code

在窗体1中添加如下代码:

 1  public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void button2_Click(object sender, EventArgs e)
 9         {
10             Form2 f2 = new Form2();
11             f2.TextBox2Value = textBox5.Text;//把父窗体的值先传给子窗体
12 
13             if (f2.ShowDialog()==DialogResult.OK)
14             {
15                 textBox5.Text = f2.TextBox2Value;
16             }
17 
18         }
19 
20 
21     }
22 }
View Code

这种可以实现子窗体和父窗体的相互传值。

第二种:委托事件传值

1.在窗体2中命名空间下先定义一个委托:public delegate void ChangeHandleText(string str);//带参数

2.定义一个事件:public event ChangeHandleText changetext;//定义事件

3.将事件与委托关联起来:Form2 f=new Form2();  f.changetext+=new ChangeHandleText(Change_text);//关键

form2代码:

  
    public delegate void ChangeHandleText(string str);//定义委托
    public partial class Form2 : Form
    {
        
        public event ChangeHandleText changetext; //定义事件
        
       
        public Form2()
        {
            InitializeComponent();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (changetext!=null)//判断事件是否为空
            {
                changetext(textBox2.Text);//执行委托实例 
            }


        }


    }
View Code

form1代码

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.changetext += new ChangeHandleText(Change_text);
            f.Show();  
        }

 

        public void Change_text(string str)
        {
            textBox1.Text = str;
        }


    }
View Code

第三种:泛型委托和Lambda表达式结合

简单介绍下Lambda表达式:“Lambda表达式”是一种匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有Lambda表达式都使用Lambda运算符=>,该运算符读作“goes to”。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。Lambda表达式x=>x*x读作“x goes  to x times x”。可以将此表达式分配给委托类型。如下图

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}
View Code

言归正传。

窗体2代码

public partial class Form2 : Form
31     {
32         public Form2()
33         {
34             InitializeComponent();
35         }
36 
37         public Action<string> ChangeText;//之前的定义委托和定义事件由这一句话代替
38 
39         private void button2_Click(object sender, EventArgs e)
40         {
41             if (ChangeText != null)//判断事件是否为空
42             {
43                 ChangeText(textBox2.Text);//执行委托实例  
44                 this.Close();
45             }           
46         }    
47     }
View Code

窗体1代码

public partial class Form1 : Form
 8     {
 9         public Form1()
10         {
11             InitializeComponent();
12         }
13 
14         private void button1_Click(object sender, EventArgs e)
15         {
16             Form2 f2 = new Form2();
17             f2.ChangeText = (str) => textBox1.Text = str;//用lambda表达式实现,这句话必须放在f2.ShowDialog();前面
18             f2.ShowDialog();            
19         }
20     }
View Code

 

转载于:https://www.cnblogs.com/ccssxx/p/10809610.html

你可能感兴趣的:(C#跨窗体传递值)