窗体传值是在学习窗体应用程序时碰到的一类比较常见的问题,现将窗体传值方法做了一点总结,方法如下:
<1>声明全局变量传值:
在Form1中声明全局变量,如下所示:
1 public static string str = "窗体1的值";
通过Form1的button1_Click事件即可将此全局变量传递给Form2,Form1的全局变量str在Form2中可以直接访问,代码如下所示:
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Form2 frm2 = new Form2(); 4 frm2.Show(); 5 }
1 private void Form2_Load(object sender, EventArgs e) 2 { 3 this.label1.Text = Form1.str; 4 }
<2>通过构造函数传值:
重载Form2的构造函数,使其能够接受一个来自Form1的参数,重载代码如下所示:
private string str; public Form2(string s) { InitializeComponent(); this.str = s; }
上面代码中定义的string变量str用来存储从Form1传递进来的参数。
在Form1的button1_Click事件中实例化Form2并给其传递Form1的一个参数,代码如下所示:
private void button1_Click(object sender, EventArgs e) { string s = this.textBox1.Text; Form2 frm2 = new Form2(s); frm2.Show(); }
在Form2的Form2_Load中即可接受这个参数,接受这个参数值的代码如下所示:
private void Form2_Load(object sender, EventArgs e) { this.label1.Text = str; }
这样,在单击Form1的button1之后,Form2便会蹦出来,Form2的label1便会显示这个从Form1传进来的值。
<3>在窗体中声明公共属性进行传值:
在Form2中声明公共属性,代码如下所示:
private string username; public string Username { get { return username; } set { username = value; } } private string password; public string Password { get { return password; } set { password = value; } }
这样,在Form1中即可访问这些属性,也就可以将Form2中这些公共属性的值传递给Form1了,并且也可以从Form1中向Form2的这些公共属性传值。代码如下所示:
(1)Form1向Form2传值:
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.Username = "Jack"; //Form1向Form2传值 frm2.Password = "J1234"; frm2.Show(); }
private void Form2_Load(object sender, EventArgs e) { textBox1.Text = username; textBox2.Text = password; }
(2)Form2向Form1传值:
private void textBox1_TextChanged(object sender, EventArgs e) { this.Username = textBox1.Text; } private void textBox2_TextChanged(object sender, EventArgs e) { this.Password = textBox1.Text; }
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.Username = "Jack"; //Form1向Form2传值 frm2.Password = "J1234"; comboBox1.Items.Add(frm2.Username); //Form2向Form1传值 comboBox1.Items.Add(frm2.Password); frm2.Show(); }
声明公共属性传值比较灵活,受限较少,因此比较好用。但是或许这会影响数据的安全性哦。
<4>传递整个窗体进行传值。
类似于构造函数传值,将窗体作为构造函数的参数即可传递整个窗体了。代码如下所示:
private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(this); f2.Show(); }
Form1 frm1; public Form2(Form1 f1) { InitializeComponent(); this.frm1 = f1; } private void Form2_Load(object sender, EventArgs e) { this.textBox1.Text = frm1.ActiveControl.ToString(); }
这样能把Form1整个窗体传递给Form2,在Form2里即可操作Form1的数据及其控件了。
<5>更改系统文件:
更改Form1.Designer.cs,譬如要使其控件变为公共可访问的,即找到在此文件中声明的控件,将你需要在Form2里访问的控件的访问修饰符修改为public,如下所示:
private System.Windows.Forms.Button button1; private System.Windows.Forms.ComboBox comboBox1;
将上面的代码里需要更改的控件的访问修饰符更改后保存即可。这种方法我个人感觉不好,有违C#语言的封装性和数据的安全性,个人建议不提倡使用。
<6>利用委托进行窗体传值:
这种方法是我在网上看到的,对原代码做了一点点改进,利用定义委托和事件以及构造函数的方法,实现了Form1和Form2互相传值。废话不多说,请看代码:
Form1部分的代码:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string str = textBox1.Text; Form2 f2 = new Form2(str); f2.Translate += new TranslateEventHandler(f2_Translate); f2.ShowDialog(); } void f2_Translate(string value) { textBox1.Text = value; //throw new NotImplementedException(); } }
Form2部分的代码:
public delegate void TranslateEventHandler(string value); public partial class Form2 : Form { string str; public Form2(string s) { InitializeComponent(); this.str = s; } public event TranslateEventHandler Translate; private void button1_Click(object sender, EventArgs e) { Translate(textBox1.Text); this.Close(); } private void Form2_Load(object sender, EventArgs e) { this.textBox1.Text = str; } }
Form1,Form2设计如下图所示: