提问人:iorice 提问时间:10/11/2023 最后编辑:iorice 更新时间:10/11/2023 访问量:38
usercontrol dll 中的组件事件
Component events in usercontrol dll
问:
我创建了一个用户控制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 对象引用未设置为对象的实例。
我应该如何修改我的代码以避免这种情况?
答:
2赞
jmcilhinney
10/11/2023
#1
这一行:
this.OnDgvData_CellFormatting.Invoke(sender, e);
说“为事件调用已注册的事件处理程序”。当然,如果没有注册的事件处理程序,则会引发异常。 基本上是一个字段,引用将处理事件的委托。如果未注册任何事件处理程序,则该字段将为 。如果您查看任何引发自己的事件的示例,您会看到他们要么这样做:OnDgvData_CellFormatting
OnDgvData_CellFormatting
null
if (this.OnDgvData_CellFormatting != null)
{
this.OnDgvData_CellFormatting.Invoke(sender, e);
}
或者,由于支持 null 传播,因此:
this.OnDgvData_CellFormatting?.Invoke(sender, e);
在这两种情况下,代码都说“当且仅当注册了一个或多个事件处理程序时,才调用事件的已注册事件处理程序”。OnDgvData_CellFormatting
评论
GridCellFormatting
OnGridCellFormatting