C# 如何确定DataGridView.CellFormatting事件是否有任何事件处理程序?

C# 如何确定DataGridView.CellFormatting事件是否有任何事件处理程序?,c#,datagridview,event-handling,C#,Datagridview,Event Handling,我正在编写一个从DataGridView继承的控件。我想做的一件事是处理一个bug,在没有处理CellFormatting事件和自己进行格式化的情况下,不使用列的格式提供程序 我想我会写一个OnCellFormatting方法,它说如果有一个列格式提供程序,并且没有CellFormatting事件处理程序,那么就进行格式化 我认为最重要的一点是…没有CellFormatting事件处理程序 现在,在过去,当我编写带有事件的控件时,我做过如下操作: public event EventHand

我正在编写一个从DataGridView继承的控件。我想做的一件事是处理一个bug,在没有处理CellFormatting事件和自己进行格式化的情况下,不使用列的格式提供程序

我想我会写一个OnCellFormatting方法,它说如果有一个列格式提供程序,并且没有CellFormatting事件处理程序,那么就进行格式化

我认为最重要的一点是…没有CellFormatting事件处理程序

现在,在过去,当我编写带有事件的控件时,我做过如下操作:

  public event EventHandler SomethingHappened;

  protected void OnSomethingHappened(EventArgs e)
  {
     EventHandler handler = this.SomethingHappened;
     if (handler != null) handler(this, e);
  }
这很好,我的理解是,该模式确定是否将处理程序附加到事件,如果是,则调用这些处理程序。很公平,但为什么我不能这样做:

  protected void OnCellFormatting(EventArgs e)
  {
     EventHandler handler = this.CellFormatting;
     if (handler == null) DoSomething();
  }
错误是事件“System.Windows.Forms.DataGridView.CellFormatting”只能出现在+=或的左侧-=

这类活动有什么不同

如果我去定义事件,并创建自己的,即

公共事件DataGridViewCellFormattingEventHandler CellFormatting2

…编译器很乐意将其分配给我的处理程序变量,所以我的问题是-CellFormatting事件与其他许多事件有什么不同,我无法确定是否有任何事件处理程序

谢谢,
Ross

只有声明事件的类才具有对事件的完全访问权限

例如,您不能从其他类(甚至是派生类)调用事件

您处于这种情况,因为您是从DataGridView派生的

您可以使用反射:


这表明无法执行分配,因为它是只读的。您可以尝试将处理程序声明为私有吗?

谢谢。我确实发现它有一个方法来获取事件处理程序委托列表,虽然它很聪明,但我不想将它放入生产代码中。谢谢-虽然这不是因为任何内容都是只读的,但这是因为继承控件无法访问继承控件的事件。