0

我正在编写一个继承自 DataGridView 的控件。我想做的一件事是处理在不处理 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 事件有什么不同(并且假设还有许多其他事件)我无法确定它是否有任何事件处理程序?

谢谢,罗斯

4

2 回答 2

0

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

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

您处于这种情况,因为您来自DataGridView.


您也许可以使用反射:

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

MSDN:Type.GetEvent 方法

于 2012-04-30T09:23:41.067 回答
0

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

于 2012-04-30T09:26:19.007 回答