usercontrol dll 中的组件事件

Component events in usercontrol dll

提问人:iorice 提问时间:10/11/2023 最后编辑:iorice 更新时间:10/11/2023 访问量:38

问:

我创建了一个用户控制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 对象引用未设置为对象的实例。

我应该如何修改我的代码以避免这种情况?

C# 事件 DLL 用户控件

评论

0赞 mamift 10/11/2023
请不要将代码作为图像发布,而是将其作为纯文本发布在问题本身中。请参阅:stackoverflow.com/help/how-to-ask
0赞 jmcilhinney 10/11/2023
“我希望主程序能够编辑 dataGridView 的 CellFormatting 事件”。这种说法毫无意义。你真的是说你希望主程序能够处理网格的那个事件吗?
0赞 jmcilhinney 10/11/2023
以“On”开头的事件名称是一种不好的做法。整个 .NET 中的约定是将事件命名为“X”,引发该事件的方法命名为“OnX”。我建议你阅读这篇文章,以更多地了解提出你自己的事件的惯例。
0赞 jmcilhinney 10/11/2023
就个人而言,我会命名你的事件。对于承载用户控件的窗体,在内部用于网格的字段名称是无关紧要的,因此在此之后命名事件是一个好主意。主持人只关心事件的用途,它用于设置网格单元格的格式。还可以添加一个名为 引发该事件的方法。该方法不是必需的,但是,如果您阅读上面链接的博客文章,就会看到该方法可以在派生类中重写,以在事件周围添加额外的行为。GridCellFormattingOnGridCellFormatting
0赞 iorice 10/11/2023
@jmcilhinney 你是对的。我将我的事件重命名为 GridCellFormatting。而这个用户控件dll,dataGridView事件“private void DgvData_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)”,这应该重命名并改为“virtual protected void OnDgvData_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)”?

答:

2赞 jmcilhinney 10/11/2023 #1

这一行:

this.OnDgvData_CellFormatting.Invoke(sender, e);

说“为事件调用已注册的事件处理程序”。当然,如果没有注册的事件处理程序,则会引发异常。 基本上是一个字段,引用将处理事件的委托。如果未注册任何事件处理程序,则该字段将为 。如果您查看任何引发自己的事件的示例,您会看到他们要么这样做:OnDgvData_CellFormattingOnDgvData_CellFormattingnull

if (this.OnDgvData_CellFormatting != null)
{
    this.OnDgvData_CellFormatting.Invoke(sender, e);
}

或者,由于支持 null 传播,因此:

this.OnDgvData_CellFormatting?.Invoke(sender, e);

在这两种情况下,代码都说“当且仅当注册了一个或多个事件处理程序时,才调用事件的已注册事件处理程序”。OnDgvData_CellFormatting