0

VB .NET関数の開始時に、イベントハンドラーを削除し、関数の最後に再度追加します。これは、関数のコードがこれらのイベントをトリガーし、関数の期間中はイベントをトリガーしたくないためです。これは通常は機能しますが、イベントを削除したにもかかわらず、イベントが呼び出される状況がいくつか発生しました。関数の最初に2回削除すると修正される場合もありますが、何度削除しても起動する場合もあります。これを引き起こしている可能性があるものについてのアイデアはありますか?

編集

コードは、仮想モードのdatagridviewを持つフォームにあります。datagridviewのCellValueNeededイベントをトリガーするいくつかの操作を実行したいのですが、そのイベントは発生しません(干渉するため)。

Public Sub DoEventRaisingStuff()
    RemoveHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded

    'Do things that would trigger CellValueNeeded

    AddHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded
End Sub

ハンドラーを複数回削除してもイベントの発生が妨げられることはないため、誤って別の場所にハンドラーが複数回追加されたようには見えません。

どのイベントハンドラーがアクティブであるかを確認する方法はありますか?

4

2 に答える 2

1

イベント処理コードが呼び出されている場合は、次の 2 つのいずれかが発生しています。

  1. イベントハンドラーを削除していません。

  2. イベント ハンドラを複数回追加しています。これはより一般的なケースです。

過去に 2. を見つけることができた唯一の方法は、イベント ハンドラーが追加されたすべての場所 (できれば 1 つまたは 2 つだけ) を見つけて、それらの行にブレーク ポイントを配置することでした。次に、デバッガーでアプリケーションを実行したところ、予想よりも多くの回数中断することがわかりました。コール スタックを使用して理由を突き止めます。追加コードを間違った場所 (たとえば、フォームのインスタンス化ではなくボタンを押したとき) に置くのは常に私です。

削除コードでも同じことができます。各ブレークポイントにヒットした回数を数え、それらが同じではない場合は、コール スタックをバックアップして、その理由を突き止められるかどうかを確認します。

于 2010-07-06T19:19:13.390 に答える
0

関数でクラス スコープのフラグを使用し、イベント ハンドラーでフラグを確認します。

すなわち:


Private RunFunction as Boolean = False

...

Private Sub MyEvent(e as system.eventargs) handles myObject.Method
   If RunFunction Then
      ...
   End If
End Sub

...

Private Sub MyFunction()
   RunFunction = False

   ...

   RunFunction = True
End Sub
于 2010-07-06T11:55:34.163 に答える