backgroundWorker.ProgressChanged事件触发太快

时间:2014-01-16 19:18:55

标签: c# datagridview backgroundworker

我有方法:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     if (!backgroundWorker1.CancellationPending)
     {
         Ctransakcja obj = (Ctransakcja)e.UserState;
         string[] row = new string[] { obj.id.ToString(), obj.tytul, obj.kwota, obj.nrkonta,obj.bank };
         dataGridView2.Rows.Add(row); 
     }
}

此方法将行添加到datagridview。 在backgroundworker的dowork事件中,我调用连接到数据库并触发ReportProgress事件的方法LoadData。

LoadData:

...
while (reader.Read())
{
   obj.id = int.Parse(reader[0].ToString());
   obj.tytul = reader[1].ToString();
   obj.kwota = reader[2].ToString();
   obj.nrkonta = reader[3].ToString();
   obj.bank = reader[4].ToString();
   //dodanie danych itd
   backgroundWorker1.ReportProgress(i, obj);
   i++;
  // Thread.Sleep(100);
}
...

所有内容都适用于Thread.Sleep(100),但数据网格视图中没有睡眠日期会被混合和复制。我需要一些WAIT函数来检查是否添加了行,并在数据库的下一行调用下一个报告进度。

感谢

1 个答案:

答案 0 :(得分:0)

ReportProgress事件确实不应该用于绑定您的数据。它更适用于使用进度更新UI控件。使用Invoke()

将您的数据绑定在后台线程中
while (reader.Read())
{
   obj.id = int.Parse(reader[0].ToString());
   obj.tytul = reader[1].ToString();
   obj.kwota = reader[2].ToString();
   obj.nrkonta = reader[3].ToString();
   obj.bank = reader[4].ToString();
   //dodanie danych itd


   dataGridView2.Invoke((MethodInvoker) delegate { dataGridView2.Rows.Add(obj);});

}