2012-03-14 48 views
0

下面的動作的情景:
平臺:視窗
IDE:微軟的Visual Studio 2008
語言:C#
.NET框架:3.5

我的應用程序包含2 buttons - 「加載數據」和「停止加載數據」和multi-line textbox。點擊「加載數據」button後,一些數據開始在textbox中加載。爲了防止用戶多次單擊「加載數據」button,我已經在點擊後禁用了button。當整個數據在textbox中加載時,「加載數據」button再次被激活。另一方面,當點擊「停止加載數據」button時,停止加載數據(如果用戶希望在加載整個內容之前停止它)。如前所述,爲防止用戶多次點擊「加載數據」button,我已禁用button,意圖用戶只能點擊「停止加載數據」button或等待整個數據爲載入textbox。我實現了這一點。乍一看它似乎運作良好。但在測試過程中,我發現即使「加載數據」button已禁用,如果用戶單擊了button,雖然此時沒有任何事情發生,但只要整個數據加載並且button再次啓用,該點擊就會生效發現在禁用狀態期間被執行。就好像程序正在記錄擊鍵和鼠標點擊並等待按鈕再次變爲活動狀態。但是我的程序中沒有這種按鍵或鼠標點擊記錄功能。什麼導致了這樣的活動?我怎樣才能防止這種行爲?

謝謝。防止用戶點擊一個特定的按鈕時,正在執行

+2

你是否因爲不使用後臺線程來執行操作而阻止了用戶界面? – Matthias 2012-03-14 14:47:50

+0

@ winSharp93:我正在使用後臺線程來執行操作。但我仍然遇到了一些問題。感謝Yahia,因爲建議的解決方案適合我。 – OutOfBoundsException 2012-03-14 15:08:51

回答

3

一種選擇是使用重入定點工作:

你可以定義一個int場(0初始化),並通過Interlocked.Increment在進入方法更新它,才能繼續進行,如果是1,在結束只是做一個Interlocked.Decrement

使其可見用戶,你可以在開始執行時禁用按鈕,並啓用它,當執行結束了......

BTW:長時間運行的任務應該異步完成(通過單獨的螺紋爲例)...

+0

我真的很喜歡這個解決方案。另外,你也可以在你的業務中使用這種技術:)。 – squelos 2012-03-14 14:51:09

+0

@squelos對於多線程場景也是安全的:-) – Yahia 2012-03-14 14:52:24

+0

是的,那爲什麼我經常在我的業務中使用它。當你在一個線程中開始工作時,它幾乎是一樣的機制,並且不想在第一個工作完成之前啓動另一個工作。 – squelos 2012-03-14 14:57:13

0

如果你把你的電話一個同步,它會鎖定整個頁面,直到加載完成。

否則你會只是做你已經嘗試過的方法,我想看看你的殘疾人狀態代碼,因爲東西告訴我你使它看起來被禁用,它仍然是一個功能按鈕

0

我敢打賭,你甚至不能移動窗體,直到數據加載,並且你也無法停止加載數據。問題是整個表單凍結,直到加載完成。您必須將加載部件移動到單獨的線程中。

0

好了,再另silution:

在負載開始是隱藏load按鈕代替它(說)顯示一個進度條。在完成加載或在stop loading點擊使load按鈕再次可見。在這種情況下,您可以避免您抱怨的「連鎖點擊」管理。

或管理一個按鈕。首先是load,點擊後,變成stop load。考慮到有限的屏幕空間,您會在移動環境中經常發現這樣的解決方案。但我認爲它也可以應用於桌面,並取得巨大成功。爲什麼不?

相關問題