如何将Form1的方法传递给Form2的控件作为事件处理程序?
解决窗体间传递方法并绑定控件事件的问题
嘿,这个需求其实用C#里的委托就能轻松搞定,咱们直接改代码来实现:
第一步:修改Form2的代码,接收并调用传递过来的方法
我们可以用.NET内置的Action委托类型(专门对应无参数、无返回值的方法),先在Form2里定义一个字段保存传递的方法,然后修改构造函数来接收这个委托,最后在按钮点击事件里调用它:
public class Form2 : Form { // 用来存储从Form1传递过来的方法 private Action _targetMethod; // 修改构造函数,接收Action类型的参数 public Form2(Action passedMethod) { InitializeComponent(); _targetMethod = passedMethod; // 绑定按钮点击事件到我们的处理方法 this.Button1.Click += Form2Button_Click; } // 按钮点击的处理逻辑:调用传递过来的方法 private void Form2Button_Click(object sender, EventArgs e) { // 使用?.Invoke()避免传递null时出现空引用异常 _targetMethod?.Invoke(); } }
第二步:修改Form1的代码,传递方法给Form2
在Form1创建Form2实例的时候,直接把MyFunction作为参数传给Form2的构造函数就行:
public class Form1 : Form { public Form1() { InitializeComponent(); } public void Button1_Click(object sender, EventArgs e) { // 把Form1的MyFunction传递给Form2 Form2 newForm = new Form2(this.MyFunction); newForm.Show(); // 记得显示Form2哦 } public void MyFunction() { MessageBox.Show("This is passed function from " + this.Text); } }
额外说明
- 如果你的方法需要传递参数或者有返回值,可以换成对应的委托类型:比如带一个字符串参数的方法用
Action<string>,有返回值的用Func<TResult>(比如Func<int>表示返回int的无参方法)。 - 用
_targetMethod?.Invoke()而不是直接_targetMethod.Invoke(),是为了防止不小心传递了null值导致程序崩溃,这是一种安全的写法。
内容的提问来源于stack exchange,提问作者Aleksa Ristic
相关产品推荐
相关产品推荐

