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

时间:2012-04-30 09:16:35

标签: c# datagridview event-handling

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

谢谢, 罗斯

2 个答案:

答案 0 :(得分:0)

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

例如,您无法从其他类调用事件 - 甚至是派生的事件。

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


您可以使用反射:

How do I raise an event via reflection in .NET (c#)?

MSDN: Type.GetEvent Method

答案 1 :(得分:0)

这表明无法执行赋值,因为它是只读的。也许你可以尝试声明处理程序是私有的吗?