如何确定是否存在 DataGridView.CellFormat 事件的任何事件处理程序



我正在编写一个继承自DataGridView的控件。我想做的一件事是处理一个错误,即如果不处理 CellFormatting 事件(并自己进行格式化(,就不使用列的格式提供程序。

我想我会写一个"OnCellFormatting"方法,它说"如果有一个列格式提供程序,并且没有 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

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

谢谢罗斯

只有声明事件的类才能完全访问它。

例如,不能从其他类调用事件 - 即使是派生类。

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


您可以使用反射:

如何在 .NET (c#( 中通过反射引发事件?

MSDN: Type.GetEvent Method Method

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

相关内容

  • 没有找到相关文章