Easy Delegate ve事件问题

时间:2016-10-16 20:29:55

标签: c# winforms visual-studio-2015

以前是工作但是现在不工作为什么我不知道这是什么问题?

在示例中有2个表单form1有1个按钮form2在启动程序时有1个文本框并单击按钮form1应该关闭,form2打开并且委托变量应该写在文本框中但不能正常工作。错误是" System.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");
}

但仍无效。 谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

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

在被捕之前,事件为空。您必须在调用之前检查事件:

if (kapat =! null)
{
  kapat.Invoke("deneme");
}

执行此操作的紧凑方法是使用null-operator:

kapat?.Invoke("deneme");

第二个错误是将第二个表单显示为对话框,因为在对话框关闭之前,您将阻止方法。如果您的click方法如下所示,它将起作用:

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