【问题标题】:Using delegates to communicate between forms使用委托在表单之间进行通信
【发布时间】:2015-12-06 12:20:05
【问题描述】:

这将是一个简单的问题。我有两种形式。 Form2 将一个字符串传递给 Form1。 Form1 然后在 MessageBox 中显示输入的字符串。

我在 form2 中的代码:

public delegate void PassData(object o);
public PassData pd;
public Form2()
{
    pd("Hello World");
    InitializeComponent();
}

form1中:

public Form1()
{
    InitializeComponent();

    var f2 = new Form2();
    f2.pd = Arrive;
    f2.Show();
}

public void Arrive(object o)
{
    MessageBox.Show(o.ToString());
}

问题: System.NullReferenceException 类型的未处理异常,位于pd("Hello World"); 我知道它是空的,但为什么这是一个问题?我将 Form2 的构造函数中的一个值传递给它。

【问题讨论】:

    标签: c# winforms delegates


    【解决方案1】:

    我在 Form2 的构造函数中传递了一个值。

    不,你在初始化Form2 之后通过了它。当Form2的构造函数被调用时,你的pd的值仍然是null,因此NullReferenceException

    这一行:

    var f2 = new Form2();
    

    导致它运行:

    public Form2()
    {
        pd("Hello World");
        InitializeComponent();
    }
    

    你真正想要的是将它作为参数传递给Form2的构造函数:

    public Form1()
    {
        InitializeComponent();
        var f2 = new Form2(Arrive);
        f2.Show();
    }
    
    public Form2(Passdata passData)
    {
        pd = passData;
        pd("Hello World");
        InitializeComponent();
    }
    

    【讨论】:

    • 除此之外,您可能希望 a) 强制 passData 的构造函数参数不为 null 并且 b) 将 pd 字段设置为 private 以防止它被重置为null 来自课堂外。 (除此之外,在调用它们之前检查null 的委托/事件处理程序是很常见的——比如if (pd != null) { pd("Hello World"); }——如果“无处理程序”是一个有效选项)。
    • 它有效,我也会按照 Matthias 的建议进行更改。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多