You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:37