0

イベントを追加したカスタム datagridviewcolumn があります。問題は、現在の列オブジェクトのイベントを購読しているユーザーを確認し、それらの購読を複製された列オブジェクトに追加する方法がわかりません。

イベントにハンドラーを追加する代わりに、カスタム列のデリゲートにハンドラーのアドレスを渡すよう呼び出し側プログラムに要求することで、この問題を回避します。

私の言いたいことを理解していただければ幸いです。

メソッドへの参照を受け取ることで、datagridviewcolumn が制御できるようになり、その参照を簡単に複製できます。

これは問題ありませんが、コントロールのユーザーは、メソッドのテンプレートを作成するビジュアル スタジオでイベントを選択することにより、イベントをサブスクライブできることを期待しています。

4

2 に答える 2

1

興味のある方のために、カスタム イベントを必要とせずにこれを実行する方法を見つけました。

イベント名にEventというサフィックスを付けることで、いくつかのプロパティとメソッドにアクセスできます。したがって、Thorsten の例では、このイベントを WorkCompleted Eventと呼びます。

この質問に固有のものとして、イベントに関連付けられたデリゲートのリストを返すメソッドGetInvocationListがあります。

これに加えて、WorkCompleted Event IsNot Nothing をチェックすると、呼び出しリストを取得しなくても、イベントのハンドラーがあるかどうかがわかります。

于 2009-09-02T15:12:26.727 に答える
1

少なくとも C# では、プロパティのゲッターとセッターのように、イベントの「アダー」と「リムーバー」を使用できます。

誰かがイベント ハンドラーをイベントに追加するプロセス中に、それを使用してカスタム処理を行うことができるでしょうか?

編集
私は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 に答える