我试图在双击网格单元格时返回一个值。这是我设置代理和事件处理程序的代码:
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]的值。
答案 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);
}
然而,事件实际上是松耦合的。
如果一切都在您的控制之下,只需直接调用一个方法并将自己从事件中解脱出来。