这是一个代码示例,您需要将一个名为 list_of_items
的 ListBox
放置到表单上,以重现我遇到的问题:
Imports System.Threading.Tasks
Public Class Form1
Dim _dt As DataTable
Private Sub Form1_Load() Handles MyBase.Load
_dt = New DataTable
With _dt.Columns
.Add("key")
.Add("value")
End With
With list_of_items
.ValueMember = "key"
.DisplayMember = "value"
.DataSource = _dt
End With
Dim addItemsTask As New Task(AddressOf AddThreeItems)
addItemsTask.Start() 'does not add anything when done
'AddThreeItems() #doing this instead works!
End Sub
Private Sub AddThreeItems()
Threading.Thread.Sleep(2000)
With _dt.Rows
.Add({"1", "One"})
.Add({"2", "Two"})
.Add({"3", "Three"})
End With
Me.Invoke(Sub() Me.Text = "Separate thread is done")
End Sub
End Class
问题是行确实在物理上添加,因此 DataTable.Rows.Count 增加,但视觉上没有任何反应。我尝试调用 Refresh
,将 DataSource
重置为 Nothing
并返回 - 这没有帮助。如果我将其切换为单线程处理,则可以使用所示方法很好地添加行。可能是什么问题?
最佳答案
重新分配数据源
Me.Invoke(
Sub()
list_of_items.DataSource = Nothing
list_of_items.DataSource = _dt
Me.Text = "Separate thread is done"
End Sub
)
关于vb.net - 无法从另一个线程向 DataTable 添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13055035/