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");
}

但仍然不能工作。谢谢你的回答。

Easy Delegate事件问题

我不确定你想用代码实现什么-但我认为/希望这只是一个最小的例子。所以这里有一个解决方案:

事件在被订阅之前为空。您必须在调用事件之前检查它:

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();
}