2

最初のクリックで開始された後、データが処理されている間、ユーザーがボタンを複数回クリックするのをブロックしようとしています。

ボタンを無効にしても、ユーザーがボタンを複数回クリックすると、フォームはクリックを登録し、前のデータ処理ルーチンの直後にデータ処理を再開するため、ボタン(buttonBackupNow.Enabled = false;)を無効にするだけでは役に立ちません。

ボタンを非表示にしてみましたが、それでも同じ結果です。フォームを無効にしてみましたが、同じ結果になりました。したがって、唯一の解決策は、データの処理中にクリックを完全に無視することだと思います。

では、フォームがユーザーのマウスクリックを受け取らないようにするにはどうすればよいですか?

編集:この問題は、データ処理が終了した後にボタンを再度有効にしようとしているという事実に関連しています。

4

6 に答える 6

4

ボタンを無効にするだけでは(buttonBackupNow.Enabled = false;)、ボタンが無効になっている場合でもユーザーがボタンを複数回クリックすると、フォームはクリックを登録し、前のデータ処理ルーチンが終了するとすぐにデータ処理を再開するため、役に立ちません。 。

本当に?どのようにそれを達成しましたか?全く再現できませんでした。ボタンを無効にすると、Clickイベントがトリガーされなくなりました。

これだけで十分です。イベントを切り離す必要はありません(他のトリックを使用する必要もありません)。それに頼る必要がある場合は、他の場所で何かが正しくない可能性があります(おそらく、いくつかのコードがボタンを再度有効にしていますか?)。

ハンドラーを削除しても、その答えに応じてあなた自身が述べたように、あなたにとってはうまくいかないという事実はJustin Harvey、問題がどこかにあることを私に安心させます。


PS。UXの観点からは、ボタンを無効にする方が、クリックを無視するよりもはるかに優れています。これは、ユーザーに視覚的なフィードバックを提供するためです。コマンドは現在使用できません。「今ではない、私はすでにこのようなことをしている」というメッセージを表示することは、おそらくさらに良いかもしれません。しかし、クリックに反応しないときにボタンをクリック可能のままにしておくのは悪いことです。


更新: OPが問題を明らかにした後(コメントで)

さて、ボタンを押すとすぐに無効にし、データ処理シーケンスが続き、ボタンが終了したらボタンを再度有効にします。しかし、この問題は、データ処理によってアプリケーションが応答しなくなるという事実に関係していると思います。それでも、フォームはクリックを登録し、再度有効にするとボタンが再び押されます。

この操作は非同期で(バックグラウンドスレッドで)実行する必要があります。BackgroundWorkerオブジェクトを使用して、RunWorkerCompletedイベントでボタンを再度有効にします。

それは問題を解決しました。

于 2012-08-21T13:01:07.710 に答える
3

ハンドラーを削除できます。

this.button.Click -= button_Click;

その後、処理後に復元します。

于 2012-08-21T12:52:16.380 に答える
1

C#はわかりませんが、イベントを処理するときに、変数alreadyClickedがtrueであるかどうかを(作成して)確認できると思います。そうでない場合は、trueに設定して、イベントを通常どおり処理します。
このように、ユーザーがボタンを2回クリックすると、alreadyClickedがtrueになり、コードは実行されません。

于 2012-08-21T12:53:38.173 に答える
0

これを防ぐ方法はたくさんあると思いますが、非常に簡単な方法は、フォームにブール変数を設定して、ユーザーがボタンを既にクリックしたかどうかを確認し、on_clickイベント内のコードを初めて実行する場合にのみ実行することです。彼はボタンをクリックします。

于 2012-08-21T12:55:06.940 に答える
0

ボタンのクリックイベントで処理しているものをトリガーする代わりに、フォームの送信でトリガーします。したがって、ユーザーが最初にフォームを送信すると、決定するまでフォームがデフォルトにならないようにします。

于 2012-08-21T12:56:57.287 に答える
0

上記の答えはどれも正しくありません。

本当の理由は、ボタンクリックイベントハンドラメソッドを実行するのはメインスレッドであり、マウスクリックがあることを検出してそれをどう処理するかを決定するメインスレッドでもあるということです。

ボタンクリックイベントハンドラーでは、最初にボタンを無効にし、次に時間のかかるジョブを実行し、最後にボタンを有効にします。時間のかかるジョブの実行中に、次のマウスクリックが処理され、無視されることを期待します。 。しかし、そうではありません。メインスレッドは、イベントハンドラーが終了した後、次のマウスクリックを確認するだけで、その時点でボタンが再度有効になっています。

したがって、必要なのは、イベントハンドラーのボタンを無効にし、そのイベントハンドラーの最後で、100ミリ秒のタイマーを開始してから、タイマーにボタンを再度有効にすることです。このように、メインスレッドがイベントハンドラーを終了すると、ボタンは無効のままになり、メインスレッドは次のマウスクリックを実行して消費し、ボタンを無駄にします。次に、タイマーが起動してボタンを再度有効にし、クリックできるようにします。また。

于 2016-04-11T05:37:16.260 に答える