10

これは非常に単純で非常に一般的な問題のようです。私が考えることができる最も簡単な例はこれです:

フォームには5つのチェックボックスがあり、その上に「すべてチェック/なしチェック」チェックボックスがあります。ユーザーがすべてのチェックボックスをオンにすることを選択すると、「子」の状態を切り替えます。すべてのチェックボックスの設定が完了するまで、すべての子のチェックイベントを発生させたくないのは明らかです。

フォーム全体のサスペンドコントロールイベントが見つかりません。私が単にそれを逃しているなら、それから素晴らしい簡単な答え。私が見逃している単純な解決策を除いて、フォーム制御イベントを一時停止するための最良の方法(ベストプラクティス?受け入れられた解決策?)は何ですか?

4

6 に答える 6

6

私は以前にこれに出くわしたことがあり、通常、人々がこれを行うのを見ました:

/*SNIP*/

private bool isMassUpdate;

public void Check1_Check(object sender, EventArgs e)
{
   if(!isMassUpdate)
   {
       do some stuff
   }
}

/*SNIP*/

イベント ハンドラーをデタッチして再アタッチすることもできますが、これはメモリ リークの原因になる可能性があると言われています。

メモリ リークとイベント ハンドラーに関する情報: アタッチとデタッチに直接関連するものではありませんが、アプリケーションの 1 つで、継承ツリーの下のイベント ハンドラーの不適切な参照が原因であることがわかりました。

于 2008-11-13T17:47:29.157 に答える
5

これらの場合、イベントを中断するブール値を使用する代わりに、カウンターを使用します。カウントが > 0 の場合はイベントを中断し、カウント = 0 の場合はイベントを再開します。これは、イベントの一時停止を要求できるものが複数ある場合に問題を解決するのに役立ちます。

もう 1 つの便利な点は、ブロック内のイベントを一時停止する必要がある場合、"using" ブロック (C#) で使用できる IDisposable である小さなヘルパー クラスを作成することです。対象外です。

于 2008-11-13T23:27:15.523 に答える
3

あなたの他の質問から、VB .NET を使用していると思います。したがって、RemoveHandler が最善の策です。通常、VB では、Handles 句を使用してイベント ハンドラーを設定します。ただし、次の方法でも実行できます。

AddHandler chk1.CheckedChanged, AddressOf DoSomething

DoSomething は次のようになります。

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs)
    ' whatever
End Sub

AddHandler はイベントを接続するため、イベントが発生します。起動しないようにするには、RemoveHandler を使用します。

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething

子チェックボックスの Checked プロパティを更新する前に、それぞれに対して RemoveHandler を呼び出します。完了したら、AddHandler を呼び出して、イベント ハンドラーを元に戻します。すべてのチェックボックスが同じハンドラーを使用している場合は、それらをコレクションに入れ、コレクションをループしてハンドラーを追加または削除できます。

于 2008-11-13T17:44:21.690 に答える
1

スタック オーバーフローの質問を参照してくださいC# Windows フォームでコントロールの状態を変更するときに発生する単純なイベントを無視するにはどうすればよいですか?

より一般的なケースでは、コントロール間に複雑な関係がある場合、独自の Focused プロパティをチェックすることで、どのコントロールがイベントを発生させたかを確認できます...各オブジェクトはそれ自体にのみ依存しています。

于 2014-10-03T03:34:55.057 に答える
1

私のVisual Basic 6.0アプリケーションでは、ユーザーがすべてをダブルクリックするのを処理する必要があったため、すべてのイベント ハンドラーで、グローバル変数をチェックする行を 1 つ作成しました。

Private bSuspendEvents as Boolean

Private Sub Button1_Click()

    On Error Goto ErrorHandler

    If bSuspendEvents then Exit Sub

    bSuspendEvents = True

    'Do stuff

    NormalExit:
        bSuspendEvents = False
        Exit Sub

    ErrorHandler:
        'Handle Error
        Resume NormalExit

End Sub
于 2008-11-13T21:02:30.540 に答える
1

チェック変更ではなく、ボタンの「クリック」イベントの処理を検討することもできます。それはあなたの意図に近いかもしれません。

于 2008-11-13T17:51:43.187 に答える