我有方法:
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函数来检查是否添加了行,并在数据库的下一行调用下一个报告进度。
感谢
答案 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);});
}