我正在编写一个继承自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
这表明无法执行分配,因为它是只读的。也许您可以尝试将处理程序声明为私有?