C#事件处理程序委托返回Null

时间:2016-07-03 16:17:27

标签: c# events delegates

我试图在双击网格单元格时返回一个值。这是我设置代理和事件处理程序的代码:

   public class SelectedItemEventArgs : EventArgs
    {
        public string SelectedChoice { get; set; }
    }

    public event EventHandler<SelectedItemEventArgs> ItemHasBeenSelected;

以下是设置双击的代码:

    private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        var handler = ItemHasBeenSelected;

        if (handler != null)
            {
                handler(this, new SelectedItemEventArgs
                { SelectedChoice = txtCustomer.Text.ToString() });
            }
    }

处理程序始终为空。如果我将事件处理程序代码更改为:

    private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {

        var handler = ItemHasBeenSelected;
        string choice = dataGridView1[0, e.RowIndex].ToString();
        if (choice != null)
        {
            handler(this, new SelectedItemEventArgs
            { SelectedChoice = choice});
        }
   }

我收到错误&#34;对象引用未设置为对象的实例。&#34;我确实看到了这一点:C# Delegate returns back NULL但我无法弄清楚它是如何运作的。我最终想要返回dataGridView1 [0,e.RowIndex]的值。

1 个答案:

答案 0 :(得分:1)

您必须确保在调用事件之前将方法添加到事件中。

private void Form1_Load(object sender, EventArgs e)
{
    ItemHasBeenSelected += Form1_ItemHasBeenSelected;
}

private void Form1_ItemHasBeenSelected(object sender, SelectedItemEventArgs e)
{
    MessageBox.Show("Chosen: " + e.SelectedChoice);
}

然而,事件实际上是松耦合的。

如果一切都在您的控制之下,只需直接调用一个方法并将自己从事件中解脱出来。