2014-09-09 3 views
0

Я хочу, чтобы заполнить 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.

Как это исправить? Или, может быть, я должен сделать это по-другому?

+1

Обработчик событий 'DoWork'' BackgroundWorker' выполняется на вторичном потоке. Вы не делаете ничего, что модифицирует элемент управления на вторичном потоке. Вы вызываете 'Rows.Add' в своей сетке. № – jmcilhinney

+0

Мое решение заключалось в добавлении таких элементов, как listviewitems, вы не должны приближаться к заполнению сетки таким образом. Просто установите источник данных для сетки. Причина в моем другом решении заключается в том, что я имел дело с своевременной операцией, которая блокировала пользовательский интерфейс от добавления так много элементов. Кроме того, как @Shell упомянул ваше добавление этой строки дважды ... – Codexer

ответ

0

Вы добавляете строку дважды.

tmpDGV.Rows.Add(exeIcon, fi.Name, fi.FullName) 'First time 
row = tmpDGV.Rows(tmpDGV.Rows.Count - 1) 
AddRow(row) 'Second time 

попытка установить значения только в row объекта вместо того, чтобы добавить его снова в tmpdDGV.

+0

, что тоже не помогло, я не получал ошибку, но ничего не добавлял к dgv, я удалил dgv и переключился на Listview, сделал несколько настроек, чтобы это выглядело мой dgv и использовал метод Mr CoDeXer, о котором я упомянул в своем вопросе, и теперь все работает так, как я ожидал, но спасибо за помощь в любом случае, ребята :) – szooky

Смежные вопросы