簡體   English   中英

防止表單接收鼠標點擊

[英]Prevent form from receiving mouse clicks

我試圖阻止用戶在初始點擊啟動數據后處理數據時多次單擊按鈕。

簡單地禁用按鈕( buttonBackupNow.Enabled = false; )也無濟於事,因為即使按鈕​​被禁用,如果用戶多次單擊該按鈕,表單會在上一次數據處理例程后立即注冊點擊並重新啟動數據處理。

我試着讓按鈕看不見,結果仍然相同。 嘗試再次禁用表單,相同的結果。 所以我認為唯一的解決方案是在處理數據時完全忽略點擊次數。

那么,如何阻止表單接收用戶鼠標點擊?

編輯:此問題與我在數據處理完成后嘗試重新啟用按鈕的事實有關。

簡單地禁用按鈕(buttonBackupNow.Enabled = false;)也無濟於事,因為即使按鈕​​被禁用,如果用戶多次單擊按鈕,表單會在上一次數據處理程序完成后立即注冊點擊並重新啟動數據處理。

真? 你是如何完成的? 我根本無法復制它。 禁用該按鈕會停止觸發Click事件。

這本身應該足夠了。 你不應該去除事件(以及使用其他技巧)。 如果你需要訴諸於此,某些地方的某些東西可能不對(也許某些代碼重新啟用按鈕?)。

事實上即使刪除處理程序也不能解決問題 - 正如你自己在回答Justin Harvey的回答時所說的那樣 - 讓我放心,問題出在其他地方。


PS。 從用戶體驗的角度來看,禁用按鈕比忽略點擊要好得多,因為它會給用戶一些視覺反饋:現在命令不可用。 顯示一條消息:“不是現在,我已經在做這些事情了”或許可能更好。 但是,在沒有對點擊作出反應的情況下留下可點擊的按鈕是不好


更新:在OP澄清問題后(在評論中)

好吧,當按下按鈕時,我立即禁用它,然后是數據處理序列,完成后我重新啟用按鈕。 但我認為這個問題與數據處理它使應用程序無響應這一事實有關,但表單仍然記錄了點擊,並且在重新啟用后再次按下按鈕。

您應該異步運行此操作(在后台線程上)。 使用BackgroundWorker對象並在其RunWorkerCompleted事件中重新啟用該按鈕。

它解決了這個問題。

你可以刪除處理程序:

this.button.Click -= button_Click;

然后在處理后重新啟動。

我不知道C#但是我認為你可以(創建並)檢查一個變量yetClicked在你處理事件時是否為真,如果沒有,你將它設置為true並且正常處理事件。
這樣,當用戶單擊第二次按鈕時, yetClicked為true且代碼未執行

我可以想一下如果有很多方法可以防止這種情況,但只是一個非常快的方法是在表單上有一個布爾變量來檢查用戶是否已經點擊了按鈕,並且只在第一次執行on_click事件時執行代碼他點擊了按鈕。

使用按鈕的單擊事件觸發它,而不是觸發您使用表單提交觸發它。 因此,一旦用戶首次提交表單,您只需要阻止默認為表單,直到您決定。

以上答案都不正確。

真正的原因是:它是執行按鈕單擊事件處理程序方法的主線程,它也是檢測鼠標單擊並決定如何處理它的主線程。

在按鈕單擊事件處理程序中,首先禁用該按鈕,然后執行耗時的作業,然后在最后啟用該按鈕,希望在執行耗時的作業時,將處理並忽略以下鼠標單擊。 但這種情況並非如此。 主線程只有在完成事件處理程序后才能查看以下鼠標單擊,到那時按鈕已重新啟用!

所以你需要做的是,在事件處理程序中禁用按鈕,然后,在該事件處理程序的末尾,啟動一個100毫秒的計時器,然后讓計時器重新啟用該按鈕。 這樣,當主線程退出事件處理程序時,按鈕保持禁用狀態,主線程繼續消耗以下鼠標並浪費它們,然后,計時器啟動並重新啟用按鈕,以便您可以單擊它再次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM