WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码)
先申明下,此文适合和我差不多的菜鸟学习,没有什么高深知识点,不想耽误老鸟们的宝贵时间,如果有什么专业术语不对的还请指正啊。
最近进行WinCE的开发,第一次实际做C/S架构的项目,其中遇到很多问题。这个问题使我记忆深刻,当时在谷歌中搜索了好久都没找到想要的答案,用的就是文章标题中的原话。然后又换成“WinForm中子窗体调用父窗体的控件和事件的方法”,搜到的还是不太多。但我发现原来这个可以用委托与事件来解决(说来惭愧,后来问了一个同学,她说这个以前老师讲过,好吧,我承认上学时划水了)。
假设现在我有一个主窗体Form1,现想在另外两个窗体Form2,Form3中运用不同的方法来实现:修改Form2,Form3中的numericUpDown的值时Form1中textbox值随之改变。
先讲第一种方法,直接将整个窗体作为参数传给另一个窗体。
这是Form1中的代码:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } //第一种方法示例事件 public void changetext(string s) { this.textBox1.Text = s; } //第一种方法 private void button1_Click(object sender, EventArgs e) { //将整个窗体作为值传给Form2 var frm2 = new Form2(this); frm2.ShowDialog(); } private void Form1_Load(object sender, EventArgs e) { } }
这是Form2中代码:
public partial class Form2 : Form { //这是第一种方法 private Form1 f1; public Form2() { InitializeComponent(); } public Form2(Form1 frm1) { InitializeComponent(); f1 = frm1;//将传过来的Form1全部赋值给f1,这样就可以在这边调用Form1了 } private void Form2_Load(object sender, EventArgs e) { } private void numericUpDown1_ValueChanged(object sender, EventArgs e) { //这是第一种方法 //调用Form1中的changetext事件 f1.changetext(numericUpDown1.Value.ToString()); } }第二种方法,使用委托与事件(推荐)
委托与事件的概念这里就不讲了,如果有兴趣,大家可以去看看张子阳的博客,博客地址。
Form1中代码:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } //改变值的事件 private void frm2_changed(string s) { //此处是给原有窗体中控件赋值 this.textBox1.Text = s + s; } //清空值的事件 private void frm3_empty(string s) { this.textBox1.Text = ""; } private void button2_Click(object sender, EventArgs e) { var frm3 = new Form3(); //这是委托与事件的第二步, //写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件 frm3.changed += new Form3.Form2Handle(frm2_changed);//改变值的事件 frm3.empty += new Form3.Form2Handle(frm3_empty);//清空值的事件 frm3.ShowDialog(); } }Form3中代码:
public partial class Form3 : Form { //定义带参数的委托与两个事件 //这是委托与事件的第一步 public delegate void Form2Handle(string s); public event Form2Handle changed; public event Form2Handle empty; public Form3() { InitializeComponent(); } private void Form3_Load(object sender, EventArgs e) { } private void numericUpDown1_ValueChanged(object sender, EventArgs e) { //这是委托与事件的第三步 //传值 changed(numericUpDown1.Value.ToString()); } private void button1_Click(object sender, EventArgs e) { empty(numericUpDown1.Value.ToString()); } }