它的作用:
逐行将数据网格视图中的值读入数据库ACTB。
要清楚,这个完全相同的代码可以在我的其他程序上运行而没有问题,我不知道为什么我的当前程序每次运行后台工作程序时都会抛出错误。
我收到错误:2500不是'值'的有效值(progressbar.value)'价值'必须在最小值和最大值之间。
这是我的代码。
工作:
int MaxSchema = 0;
private void Transfer_Worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
using (OleDbConnection conn = new OleDbConnection(Con))
{
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = conn;
conn.Open();
MaxSchema = DGVExcel.Rows.Count;
for (int s = 0; s < DGVExcel.Rows.Count; s++)
{
Transfer_Worker.ReportProgress(s);
}
}
}
}
catch (OleDbException ex)
{
MessageBox.Show("Import error: " + ex);
}
Transfer_Worker.ReportProgress(100);
}
进度已更改:
private void Transfer_Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbar.Value = (e.ProgressPercentage * 100) / MaxSchema;
}
现在,注释掉我正在改进的代码似乎使进程按预期运行,甚至进度条的值也会更新。如果相同的代码块在别处工作,我不知道为什么会这样。
我还没有修改进度条,所以它仍然应该有默认属性。
是不是因为我报告了我的dowork功能的进展?如果这是我需要改变的事情,请纠正我。首先,我假设我不允许使用Background worker的Work方法更新UI,因此它应该抛出一个错误,但它没有。
编辑:似乎错误是由行
引起的 Transfer_Worker.ReportProgress(100);
将值从100(推定最大值)更改为MaxSchema(rows.Count的实际值),进度条能够正确确定终点。
答案 0 :(得分:0)
为TransferWorker的ReportProgress
属性分配默认值(100)会导致进度条值在MaxSchema
的值远小于此值时膨胀超过100%。 (100 * 100)/ 4 =报告的值为2500。
更改报告进度的值以匹配实际的行数。在这种情况下,正确的行将是:
TransferWorker.ReportProgress(MaxSchema);
关于过去工作的第二个问题,如Peter所述,行数明显更大:
Dealing with more rows would prevent the problem, because you're dividing by MaxSchema. With enough rows, the result of the calculation is small, and with 2700000 rows, the result is 0, well below the default maximum value.`"