我想使用 VB 從執行緒更新資料網格視圖。
到目前為止,我已經嘗試了兩種方法,但顯然我遺漏了一些東西。這兩種方法是:
If Control.invokeRequired Then
Control.Invoke(Sub() Control.rows.add(Event*Date, Event*Details))
我已經嘗試過:
If Control.InvokeRequired then
Control.Invoke(New Addrow(AddressOf Form1.AddToDatatable), New Object() {Data_row})
在哪里
Public Delegate Sub Addrow(ByVal Data_row As DataRow)
Public Sub AddToDatatable(ByVal Data_row As DataRow)
Data_table.Rows.Add(Data_row)
Daily_Log.Refresh()
End Sub
uj5u.com熱心網友回復:
看來您有一個DataTable系結到DataGridView. 在這種情況下,您需要將資料添加到DataTable. InvokeRequired并且Invoke是Control類的實體成員,因此需要通過控制元件參考進行訪問。如果您知道代碼正在輔助執行緒上執行,那么使用InvokeRequired是沒有意義的。我懷疑你的代碼應該是這樣的:
myDataGridView.Invoke(Sub() myDataTable.Rows.Add(someValue, someOtherValue))
InvokeRequired僅當代碼位于可能在 UI 執行緒或輔助執行緒上執行的方法中時才需要使用。例如,您可以這樣做:
Private Sub AddRow(column1Value As Object, column2Value As Object)
If myDataGridView.InvokeRequired Then
myDataGridView.Invoke(New Action(Of Object, Object)(AddressOf AddRow), column1Value, column2Value)
Else
myDataTable.Rows.Add(column1Value, column2Value)
End If
End Sub
然后,您可以在任何地方呼叫該方法,它會處理其余的。您可以在輔助執行緒上執行此操作:
AddRow(someValue, someOtherValue)
在該呼叫中,InvokeRequired將是,因此將為傳遞給True的相同方法創建一個委托,以及引數值。將越過執行緒邊界并再次呼叫。這一次將是,所以該行將被添加到。AddRowInvokeInvokeAddRowInvokeRequiredFalseDataTable
uj5u.com熱心網友回復:
謝謝大家的建議。在花了一天時間閱讀論壇試圖找出發生了什么之后,我在星期四非常沮喪地寫了我的問題。周五下午,我終于解決了。
有兩件事讓我找到了解決方案。
我無法弄清楚為什么 invokerequired 總是回傳 false。我最初認為這是因為我在除錯中運行以查看代碼。無奈之下,我洗掉了 invokerequired 并讓代碼進入呼叫。這是我能做的最好的事情,即使它拋出了一個錯誤。關于未創建表單事件的一些事情
這讓我對表單和控制元件感到好奇,所以我在 isdisposed 和 eventcreated 上添加了一些除錯代碼。兩者都回傳錯誤。
然而表格就在我眼前等待資料......
然后我突然想到,也許,只是也許我根本無法從執行緒中處理顯示的表單。無奈之下,我決定將表單添加到執行緒啟動中,并在執行緒啟動時將表單作為引數接收。
我的天啊!有效。Invokerequired 突然變為真,呼叫沒有錯誤,資料開始出現在我的表單上,破解它!
他們說努力學習不會很快被遺忘,我懷疑我會很快忘記這一點。
總之,在啟動執行緒時,將實時表單作為唯一引數傳遞,并在您的執行緒中參考傳遞的表單,而不是直接來自... Grrr。我希望我發布這篇文章有助于避免其他人把頭發扯掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526399.html
