2013-12-09 32 views
0

我有主窗體有一個打開數據網格上的主客戶的按鈕。我使用dataview來過濾使用dataview.rowfilter的數據。 問題是,在表單加載期間。它需要5-6秒(程序在那段時間內沒有響應)。我想要做的是將數據加載到背景上的數據視圖,並顯示在workercompleted的gridview上。backgroundworker拋出「創建表單時發生錯誤...」

它給了我這個錯誤:「創建表單時發生錯誤,詳細信息請參見Exception.InnerException。錯誤是:在創建OLE調用之前,當前線程必須設置爲單線程單元(STA)模式。你的Main函數有STAThreadAttribute標記在它上面。「 - > on dowork

我在某處閱讀我應該使用Invoke。但我不知道如何使用它。 這裏是我的代碼:

Private Sub custcall_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    TBfind.Enabled = False 
    SetMyCustomFormat("yyyy-MM-dd HH:mm:ss") 
    BWcustload.RunWorkerAsync() 

End Sub 

Private Sub BWcustload_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWcustload.DoWork 

    mydataview = New DataView(datatablecust) 
End Sub 

Private Sub BWcustload_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BWcustload.RunWorkerCompleted 
    DGVcustomer.DataSource = mydataview 
    TBfind.Enabled = True 
End Sub 

回答

0

您是否嘗試過的代碼移動到事件Form_Shown?

另外,你有沒有嘗試把代碼放入SyncLock中的DoWork部分?

試試這個:

SyncLock mydataview 

    mydataview = New DataView(datatablecust) 

End SyncLock 

對於STA模型......你可以添加以下到您的代碼和啓動對象設置爲Sub Main()

<STAThread()> _ 
    Public Shared Sub Main() 
     Dim mainForm As New custcall() 
     Application.Run(mainForm) 
    End Sub 

編輯:

就invoke而言。 ...這肯定會起作用......但我不知道它會解決STAThread問題。

要使用調用,首先,你必須在你的形式來聲明一個代理子:

Delegate Sub LoadDataCallback() 

聲明函數取數據的實際負荷的護理:

Private Sub LoadData() 
    mydataview = New DataView(datatablecust) 
End Sub 

然後,你會在你的Shown事件(或Load事件)中啓動一個新線程:

Dim mythread As New Thread(Sub() 
           Dim callLoad As New LoadDataCallBack(LoadData) 

           Me.Invoke(callLoad) 
          End Sub) 

mythread.Start() 

必須使用SyncLock(儘管在某些情況下,如果最終不能正常工作,您可能需要)。

不要忘記將Imports System.Threading添加到代碼文件的頂部。

+0

嗨,納森謝謝你的回覆。使用synclock方法會導致snyclock部分出現「聲明預期」錯誤。當我使用invoke方法時,它可以工作,但仍然需要5-6秒的加載時間。 – user2771233

+0

您是否記得向SyncLock添加合格對象?注意上面我輸入了「SyncLock mydataview」 可以通過檢查導入到控件上的記錄數來添加另一個線程來監視加載的進度,並向窗體報告,以便用戶知道數據仍然存在加載。遺憾的是,如果您需要導入大量數據,那麼關於加載時間的事情就不會太多了。 –

相關問題