Я хочу, чтобы заполнить dgv1 в BackgroundWorkerЗаполнение DataGridView с ImageColumn в BackgroundWorker
Я пытался сделать что-то похожее на this solution by MrCoDeXeR:
Delegate Sub SetRow(ByVal row As DataGridViewRow)
Private Sub AddRow(ByVal row As DataGridViewRow)
If Me.dgv1.InvokeRequired Then
Dim d As New SetRow(AddressOf AddRow)
Me.Invoke(d, New Object() {row})
Else
Me.dgv1.Rows.Add(row)
End If
End Sub
Private Sub bgw1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw1.DoWork
'...
Dim imgcol1 As New DataGridViewImageColumn
Dim tmpDGV As New DataGridView
Dim row As DataGridViewRow = Nothing
With tmpDGV
.Columns.Insert(0, imgcol1)
.Columns.Add("name", "")
.Columns.Add("path", "")
End With
For Each fi In f1_tab
If (bgw1.CancellationPending = True) Then
e.Cancel = True
Exit For
End If
'...
If found Then
row = New DataGridViewRow
tmpDGV.Rows.Add(exeIcon, fi.Name, fi.FullName)
row = tmpDGV.Rows(tmpDGV.Rows.Count - 1)
AddRow(row)
Threading.Thread.Sleep(1)
End If
If row IsNot Nothing Then
row = Nothing
End If
bgw1.ReportProgress(src_progress)
Next
End Sub
Однако я получаю исключение в Me. dgv1.Rows.Add (row):
Строка обеспечивает d уже принадлежит элементу управления DataGridView.
Как это исправить? Или, может быть, я должен сделать это по-другому?
Обработчик событий 'DoWork'' BackgroundWorker' выполняется на вторичном потоке. Вы не делаете ничего, что модифицирует элемент управления на вторичном потоке. Вы вызываете 'Rows.Add' в своей сетке. № – jmcilhinney
Мое решение заключалось в добавлении таких элементов, как listviewitems, вы не должны приближаться к заполнению сетки таким образом. Просто установите источник данных для сетки. Причина в моем другом решении заключается в том, что я имел дело с своевременной операцией, которая блокировала пользовательский интерфейс от добавления так много элементов. Кроме того, как @Shell упомянул ваше добавление этой строки дважды ... – Codexer