2010-09-21 136 views
2

我試着重寫OnLoad事件,但是在這個方法完成之前表單正在繪製。我打電話給base.OnLoad方法。但是,在活動期間,表單部分被吸引(看到了文物)。我注意到這一點,因爲我正在打數據庫,並且需要一些時間。在這種情況下,我收到一些數據並將其綁定到窗體的控件。請不要告訴我使用單獨的線程。爲了簡單起見,我寧願在數據加載時顯示繁忙的光標。在任何事物被繪製到屏幕之前是否有一個Form事件被調用?

更新:

好吧,我想你們/戈爾斯已經說服了我。我將使用一個單獨的線程。我並不知道BackgroundWorker,它很容易實現。現在我的表單正在快速加載。然後,突然間我的組合框被填充。但是,我想阻止用戶在填充之前點擊組合。使用Winforms的最佳方式/標準方式是什麼?有沒有辦法關閉表單中的輸入事件,直到後臺工作完成?

+2

以防萬一您改變主意使用單獨的線程:使用BackgroundWorker,它真的很容易:http://dotnetperls.com/backgroundworker – Heinzi 2010-09-21 16:13:18

+0

當UI線程繁忙時,無法顯示繁忙的遊標做數據庫訪問。在後臺線程上運行類似的操作可以讓你建立一個不錯的進度條或等待遊標。 – 2010-09-21 16:16:25

+0

我決定使用後臺工作。但是現在我有一個後續問題。看到我更新的問題。 – bsh152s 2010-09-21 18:49:49

回答

1

您可以嘗試在窗體的構造函數中執行昂貴的操作,以便在顯示窗體時它已經具有需要渲染的數據。也看看SuspendLayout/ResumeLayout方法。

但是,這些解決方案都不會像使用不同的線程執行昂貴的操作那樣優雅。

+0

我決定使用BackgroundWorker來完成數據庫命中。但是,我仍想阻止用戶修改表單上的數據,直到工作人員完成。我如何去做這件事?看到我更新的問題了解更多詳情。謝謝。 – bsh152s 2010-09-21 18:53:33

+0

我會在禁用狀態下開始控制(即Enabled = false)。並在後臺操作完成後啓用它們。 – 2010-09-21 18:59:09

2

我建議您在開始加載之前用Loading標籤覆蓋表格。

0

我不確定這是否有幫助,但在Load之前調用Move事件。

2

在調用IntializeComponent()之前,您應該能夠通過將構造函數代碼放入加載程序來解決問題。此時,窗體上的控件尚未創建(因爲這是InitializeComponent所做的)。

但是,表單在這個階段還不可見。如果你想顯示一個空白表單,那麼我認爲一個可能的解決方案(我沒有嘗試過,但我認爲它應該工作)將調用this.Show()(顯示錶單)和Application.DoEvents()讓WinForms處理事件並顯示錶格。

+0

我同意這是最簡單的方法。然而,我們的工作方式是我們的組件通過「類工廠」。我們的應用程序根據安裝的組件以及我們找出安裝的方式進行更改,方法是調用構造函數。只是試圖與我有什麼工作。 – bsh152s 2010-09-21 20:10:31

0

顯示的事件對此很有幫助。您的表單將完全顯示,然後顯示事件。當您加載數據時,這將爲用戶提供乾淨的屏幕,而不會顯示部分繪製的字段。

在您的Shown事件處理程序中,打開沙漏,完成您的工作,然後關閉沙漏。

0

ComboBox有一個BeginUpdate()EndUpdate()可以在向控件添加大量數據或緩慢數據時調用。 SuspendLayout()和窗體上的'ResumeLayout()`也可能有助於解決您的重繪問題。

如果您只想阻止用戶點擊它,您還可以禁用該控件。如果您禁用表單本身,則所有包含的控件也將被禁用。

如果您使用後臺線程,您必須確保在啓動線程之前從主UI線程調用這些線程,並在後臺工作完成時再次從主UI線程調用這些線程。

相關問題