Vb.net 链接到datatable的Datagridview未得到更新

Vb.net 链接到datatable的Datagridview未得到更新,vb.net,datagridview,datatable,Vb.net,Datagridview,Datatable,这是我正在尝试制作的同步url下载程序的一部分。它将url列表保存在名为tbl的数据表中,并绑定到名为dgvUrls的datagridview。每次遇到死url时,它都会将其从数据表中删除 我用下面的代码重现了这个错误。按钮3\u单击将向数据表添加100行,使其成为datagridview的数据源。q()通过删除第一行,一次删除一行。问题是datagridview不反映在datatable中所做的更改 Dim tbl = New DataTable Private Sub Bu

这是我正在尝试制作的同步url下载程序的一部分。它将url列表保存在名为
tbl
的数据表中,并绑定到名为
dgvUrls
的datagridview。每次遇到死url时,它都会将其从数据表中删除

我用下面的代码重现了这个错误。
按钮3\u单击
将向数据表添加100行,使其成为datagridview的数据源。
q()
通过删除第一行,一次删除一行。问题是datagridview不反映在datatable中所做的更改

    Dim tbl = New DataTable

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    'Add 100 urls, for simplicity i'm adding only integers
    tbl.Columns.Add("Urls")
    For i = 1 To 100
        tbl.Rows.Add(i)
    Next

    'bind to datagridview so that the end user can see the urls being download/removed from the list 
    dgvUrls.DataSource = tbl

    'start multithread download , for simplicited (of this question) we have only one
    Dim t As Thread = New Thread(AddressOf Download)
    t.Start()

   t.Join()
   dgvUrls.Refresh()

End Sub

Private Sub download()
    'for simplicity, the 1st 80 urls were dead!
    For i = 1 To 80
        'we remove the dead urls
        tbl.Rows.RemoveAt(0)
    Next

一般来说,
刷新
DataGridView
是一件好事,主要是当您从另一个线程执行修改时;大概是这样的:

Dim t As Thread = New Thread(AddressOf q)
t.Start()
t.Join() 'Waits for the other thread to complete, such that the next line is reached on the right moment

dgvUrls.Refresh()
我删除了
Dim ts As ThreadStart=New ThreadStart(AddressOf q)
,因为这不是必需的。您也不需要
睡眠
DoEvents

Private Sub q()
    For i = 1 To 98
        tbl.Rows.RemoveAt(0)
    Next
End Sub

作为概念证明(理解所有这些是如何工作的)是可以的;但在继续之前,您应该回顾一下您的逻辑中的各种想法:从
数据源中删除这么多行会引发问题(您会看到它会触发错误);理想情况下,(至少,我更喜欢)您应该直接修改
DataGridView
(如果可能的话),以避免信息同步问题;如果处理多个线程,则必须设置一个“更合适的结构”(建议的
t.Join()
应被视为临时修复程序,以实现此功能)。

实际上,它是文件下载程序的一部分。Sleep(10)是一个模拟文件下载的程序。如果文件无法下载,则url将从表中删除。我不能使用t.Join(),因为下载是多线程的,异步下载无法直接修改DataGridView,因为我得到了跨线程错误:(“更合适的结构”…嗯…我不知道该怎么做。但我使用了SyncLock:)@NokImchen你不在GUI线程中?!你应该这么说。此外,连接只是暂时的(如前所述)。删除完成后,您应该从GUI线程刷新datagridview。@NokImchen您必须正确描述您的情况。我只是阅读了您的代码,并假设您在GUI线程中。您必须在GUI线程中处理GUI元素。否则,你将不得不接受这种行为而不能做任何事情。你已经用我的代码更新了你的代码。好东西。现在更新最后一位:datagridview在另一个线程结束后刷新(请尝试t.Join()),我们完成了:)@varocabas,好的,我正在添加t.Join()dgvUrls.refresh()@varocabas现在我得到了这个错误这个错误非常具有描述性,与多线程或刷新数据(或这个问题)无关:但是如果你采取多重删除的态度(正如我在回答中警告的那样):)对所有消息说OK,你就会看到DataGridView更新。要正确测试此代码,只需删除1或2行,并确认一切正常。