winformsアプリでボタンをダブルクリックするユーザーに対処する最良の方法は?
-
05-07-2019 - |
質問
WinFormsアプリで作業しており、その中にユーザーコントロールがあります。ユーザーコントロールのボタンは、他のコードで処理されるフォームまでイベントを発生させます。ボタンの1つは、同時に実行すると問題を引き起こすいくつかのプロセスを開始します。状態を管理するためのコードにロジックがあるので、通常、ユーザーはプロセスが既に実行されている場合は実行できません。ただし、ユーザーがボタンをダブルクリックすると、プロセスが2回開始されるので非常に高速なので、防止するのは困難です。
これを処理する最良の方法は何ですか?
クリックイベントでボタンを無効にすることから始めましたが、最初のクリックでボタンが無効になる前に2回目のクリックが発生します。コードで他のフラグを設定しても、キャッチされませんでした。
イベントを発生させるコードに何らかの同期ロックを追加することを検討していますが、より良いアイデアを持っている人がいるかどうか疑問に思っています。
このプロジェクトはほぼ完了しているので、アプリの根本的な書き換え(複合アプリケーションブロックの実装など)を伴わない回答を探していますが、これらのアイデアは次のプロジェクト。
解決
ボタンの無効化または他のロックが、イベントハンドラーで行う/ first /であることを確認してください。最初の命令が発動する前に2つのクリックイベントをキューに入れることができたら非常に驚くでしょうが、他のアプリで動けなくなる非常に遅いコンピューターを使用している場合は可能だと思います。
そのイベントでは、フラグを使用します。
private bool runningExclusiveProcess = false;
public void onClickHandler(object sender, EventArgs e)
{
if (!runningExclusiveProcess)
{
runningExclusiveProcess = true;
myButton.Enabled = false;
// Do super secret stuff here
// If your task is synchronous, then undo your flag here:
runningExclusiveProcess = false;
myButton.Enabled = true;
}
}
// Otherwise, if your task is asynchronous with a callback, then undo your flag here:
public void taskCompletedCallback()
{
runningExclusiveProcess = false;
myButton.Enabled = true;
}
そのようなものを2回クリックしても取得できる場合は、誤ってdoubleClickイベントにサブスクライブしないようにしてください。
他のヒント
イベントを2回処理していますか
ボタンを無効にする前に2回目のクリックが発生することを読んで、非常に驚いています。イベントを2回接続しないようにしてください。私は前に偶然これをやったことがあります。その後、ほぼ瞬時に2つのイベントが発生します。
そのボタンの無効フラグは、ボタンイベントハンドラーが完了するまで設定されず、追加のクリックは最初のクリックの後ろのWindowsメッセージキューに入れられます。 UIスレッドを解放するために、ボタンイベントハンドラーが迅速に完了することを確認してください。これを行うにはいくつかの方法がありますが、いずれもスレッドを生成するか、ワーカースレッドの準備を整えてAutoResetEventを待機する必要があります。
万が一、ボタンをアイコンでラベル付けしていますか?必ずコードを使用して2つのプロセスを同時に実行しないようにしますが、ボタンが従来のコマンドボタンのように見え、動作する場合は、人間側でのダブルクリックを減らすことができます(長方形、テキストラベルのみ、クリック)。ちょっとした考え。
ボタンがクリックされたらすぐに無効にします。そのため、イベントを2回処理することはできません。イベントが処理されるとすぐに、ボタンを再度有効にできます。
チェックされた答えは、せいぜい逸話的なものに近いものです。未経験者にとっては、意味を成さないコードが多すぎます。タイマーとスレッドの使用に関する記事を執筆しましたが、コード例は本当に簡単に理解できます。新しいスレッドでタスクプロセスを実行して、上記の例のフラグを設定できるかどうかを確認してみてください。
ユーザーが最初にボタンをクリックした後、タスクを開始する前にボタンを無効にします。タスクが完了したら、ボタンを再度有効にします。
ボタンを無効にすることから始めました クリックイベントではあるが 最初のクリックの前にクリックが入る ボタンを無効にします。 コード内の他のフラグを設定しませんでした どちらかをキャッチします。
Given WinFormsは本質的にシングルスレッドであるため、最初の処理が完了する前に2回目のクリックが発生することはできません(新しいスレッドまたはBackgroundWorkersなどを使用している場合を除く)。
問題を説明するサンプルを見せていただけますか?