0

我有一个自定义 datagridview 列,我在其中添加了一个事件。问题是,我不知道如何查看谁订阅了当前列对象的事件并将这些订阅添加到克隆的列对象。

我通过要求调用程序将处理程序的地址传递给自定义列中的委托来解决这个问题,而不是向事件添加处理程序。

原谅我的术语,我希望你明白我想说什么!

通过接收对该方法的引用,datagridviewcolumn 现在拥有控制权,然后可以轻松地克隆该引用。

这很好,但控件的用户希望能够通过在 Visual Studio 中选择事件来订阅事件 - 这会创建方法的模板。

4

2 回答 2

1

至少在 C# 中,您可以为事件使用“adders”和“removers”,例如属性的 getter 和 setter。

也许您可以在某人向事件添加事件处理程序的过程中使用它来进行一些自定义处理?

编辑
我对 VB.NET 了解不多,但我用谷歌搜索了一下,发现了以下代码段:

Public Delegate Sub WorkDone(ByVal completedWork As Integer ) 
Private handlers As New ArrayList() 

Public Custom Event WorkCompleted As WorkDone 
  AddHandler (ByVal value As WorkDone)
    If handlers.Count <= 5 Then 
      handlers.Add(value)  
    End If  
  End AddHandler 

  RemoveHandler(ByVal value As WorkDone) 
    handlers.Remove(value)  
  End RemoveHandler 

  RaiseEvent (ByVal completedWork As Integer) 
    If completedWork > 50 Then  
      For Each handler As WorkDone In handlers  
        handler.Invoke(completedWork)  
      Next  
    End If  
  End RaiseEvent  
End Event 

这应该可以帮助您自定义事件处理程序,以便您可以“看到”从您的类中添加到事件的委托。

于 2009-08-19T11:20:23.187 回答
1

对于任何感兴趣的人,我偶然发现了一种无需自定义事件即可执行此操作的方法。

通过使用Event为事件名称添加后缀,您可以访问一些属性和方法。因此,在 Thorsten 的示例中,我将事件称为 WorkCompleted Event

针对这个问题,有一个方法GetInvocationList返回附加到事件的委托列表。

除此之外,检查 WorkCompleted Event IsNot Nothing 是否会告诉您是否有该事件的处理程序,而无需检索调用列表。

于 2009-09-02T15:12:26.727 回答