我创建了一个用户控件 dll,我在这个用户控件 dll 中放置了一个 dataGridView 和一些按钮。
当主程序引用usercontrol dll时,我希望主程序能够编辑dataGridView的CellFormatting事件。
我向 usercontrol dll 添加了代码
public event DataGridViewCellFormattingEventHandler OnDgvData_CellFormatting;
private void DgvData_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
this.OnDgvData_CellFormatting.Invoke(sender, e);
}
我可以在主程序中编辑用户控件的dataGridView的CellFormatting事件。
private void UserControl_OnDgvData_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//edit...
}
但是如果我不在主程序中使用UserControl_OnDgvData_CellFormatting创建事件, 执行过程中会出现异常。
system.nullreferenceexception 对象引用未设置到对象的实例。
我应该如何修改我的代码以避免这种情况?
这一行:
this.OnDgvData_CellFormatting.Invoke(sender, e);
表示“为
OnDgvData_CellFormatting
事件调用已注册的事件处理程序”。当然,如果没有注册的事件处理程序,则会引发异常。如果您查看任何发起自己的活动的示例,您会发现他们要么这样做:
if (this.OnDgvData_CellFormatting != null)
{
this.OnDgvData_CellFormatting.Invoke(sender, e);
}
或者,由于支持空传播,因此:
this.OnDgvData_CellFormatting?.Invoke(sender, e);
在这两种情况下,代码都表示“当且仅当注册了一个或多个事件处理程序时,才为
OnDgvData_CellFormatting
事件调用已注册的事件处理程序”。