Easy Delegate事件问题
本文关键字:问题 事件 Delegate Easy | 更新日期: 2023-09-27 18:13:14
这是以前的工作,但现在不工作,为什么我不知道是什么问题?
在示例中有2个表单form1有1个按钮form2有1个文本框,当启动程序并单击按钮form1应该关闭,form2打开和委托变量应该写在文本框中,但不工作。错误是"系统。"得到NullReferenceException发生"
public partial class Form1 : Form
{
public delegate void kapatici(string al);
public static event kapatici kapat;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
kapat("deneme");
Form2 f = new Form2();
f.ShowDialog();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Form1.kapat += Form1_kapat;
}
private void Form1_kapat(string al)
{
textBox1.Text = al;
//throw new NotImplementedException();
}
}
我试过不同的类型,比如
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.ShowDialog();
kapat("deneme");
}
但仍然不能工作。谢谢你的回答。
我不确定你想用代码实现什么-但我认为/希望这只是一个最小的例子。所以这里有一个解决方案:
事件在被订阅之前为空。您必须在调用事件之前检查它:
if (kapat =! null)
{
kapat.Invoke("deneme");
}
一种简洁的方法是使用空操作符:
kapat?.Invoke("deneme");
第二个错误是将第二个表单显示为对话框,因为您阻塞了方法,直到对话框关闭。如果您的click-method看起来像这样,它将工作:
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.Show();
kapat?.Invoke("deneme");
}
如果您只想在第二个表单上显示文本,则不应该使用事件。最简单的方法是通过第二种形式的构造函数传递字符串,如:
public Form2(string al)
{
InitializeComponent();
textBox1.Text = al;
}
现在你可以用:
打开表单private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2("deneme");
f.ShowDialog();
}