我有两个表单,一个FormMain和一个FormInputTagName。 FormMain使用FormInputTagName作为对话框从用户获取字符串。 为此我在FormInputTagName中声明了一个委托,这里是代码:
public partial class FormInputTagName : Form
{
public delegate void ResultDelegate(string tagName);
public ResultDelegate _resultDelegate;
public void InputTagName(ResultDelegate resultDelegate)
{
this.ShowDialog();
_resultDelegate = resultDelegate;
}
private void Ok_Click(object sender, EventArgs e)
{
this.Hide();
_resultDelegate(textBoxElementTagName.Text);
}
}
以防万一,_resultDelegate是公开的,但它没有解决问题。
在FormMain中,我有一个方法,签名为委托声明:
public void AddElement(string tagName)
{
MessageBox.Show(tagName);
}
一个代码(也在FormMain中),调用FormInputTagName将AddElement作为委托实例传递给它:
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
FormInputTagName inputForm = new FormInputTagName();
inputForm.InputTagName(new FormInputTagName.ResultDelegate(AddElement));
}
当我运行程序并在textBoxElementTagName中输入一些文本并单击Ok按钮时,它会在行
处抛出System.NullReferenceException_resultDelegate(textBoxElementTagName.Text);
可能是什么原因?可以是我以同步方式调用委托,我应该使用BeginInvoke / EndInvoke调用它吗? 还有一件事 - 如果我不将委托保存到类成员_resultDelegate中,而是立即调用它,就像那样
public void InputTagName(ResultDelegate resultDelegate)
{
this.ShowDialog();
resultDelegate("qwer");
}
它工作正常并调用AddElement函数。