2013-05-07 7 views
-1

У меня есть пользовательский интерфейс, который обновляется BackgroundWorker ProgressChanged. В нем есть индикатор выполнения и список, отображающий имя файла для каждого элемента, который обрабатывается фоном.Возможно ли получить доступ к элементу ListView из BackgroundWorker ProgressChanged?

Я хочу только добавить элемент в список, если это новый файл, поэтому я попытался использовать сравнение между последним элементом в списке и текущим именем файла.

Это, однако, вызывает ошибку TargetInvocation.

void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

     var r = Enumerable.Empty<ListViewItem>(); 
     if (this.listView1.Items.Count > 0) 
      r = this.listView1.Items.OfType<ListViewItem>(); 

     var last = r.LastOrDefault(); 

     if (last.Text != CurrentTrack.Name) 
     { 
      ListViewItem LVI = new ListViewItem(currentTrack.Name); 
      LVI.SubItems.Add(keywords); 
      LVI.SubItems.Add("Updated"); 
      listView1.Items.Add(LVI); 
      listView1.TopItem = LVI; 
      listView1.EnsureVisible(listView1.Items.Count - 1); 
     } 


     progressBar1.Value = e.ProgressPercentage; 
     lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%"; 
    } 

Можно ли это достичь?

+0

В каком номере линии у вас возникло исключение? –

ответ

0

Необходимо выполнить изменения пользовательского интерфейса в потоке пользовательского интерфейса. Это может быть достигнуто с помощью следующего кода:

frmMain() 
{ 
    Worker_ProgressChanged = new Worker_ProgressChanged_Delegate(m_oWorker_ProgressChanged); 
} 

delegate void Worker_ProgressChanged_Delegate(object sender, ProgressChangedEventArgs e); 
Worker_ProgressChanged_Delegate Worker_ProcessChanged; 
void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(Worker_ProgressChanged, sender, e); 
    } 
    else 
    { 
     ... Add list items etc. 
    } 

Если рабочий поток вызывает этот метод, InvokeRequired будет верно. Затем форма вызовет тот же метод, используя его поток (поток пользовательского интерфейса). На этот раз InvokeRequired имеет значение false, и функция выполняется в правильном потоке.

Edit: Move добавить элементы списка к другому блоку на основе комментария

+1

Убедитесь, что вы положили 'добавить элементы списка и т. Д. 'В предложение else оператора if –

0

бросить ли это та же ошибка?

void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     ListViewItem last = null; 
     if (this.listView1.Items.Count > 0) 
     { 
      last = this.listView1.Items[listView1.Items.Count - 1]; 
     } 
     if (last == null || last.Text != CurrentTrack.Name) 
     { 
      ListViewItem LVI = new ListViewItem(currentTrack.Name); 
      LVI.SubItems.Add(keywords); 
      LVI.SubItems.Add("Updated"); 
      listView1.Items.Add(LVI); 
      listView1.TopItem = LVI; 
      listView1.EnsureVisible(listView1.Items.Count - 1); 
     } 

     progressBar1.Value = e.ProgressPercentage; 
     lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%"; 
    }