【问题标题】:C# Progress bar - error on BackgroundWorker's progress changedC# 进度条 - BackgroundWorker 的进度错误已更改
【发布时间】:2017-07-03 06:01:28
【问题描述】:

它的作用

将datagridview中的值逐行读取到数据库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 函数的进度吗?如果这是我需要更改的内容,请纠正我。首先,我假设我不被允许使用后台工作者的 Work 方法更新 UI,所以它应该会抛出一个错误,但它不会。

EDIT:看来错误是由该行引起的

  Transfer_Worker.ReportProgress(100);

将值从 100(假定最大值)更改为 MaxSchema(rows.Count 的实际值),进度条能够正确确定终点。

【问题讨论】:

  • (e.ProgressPercentage * 100) / MaxSchema中,ProgressPercentage会大到100,MaxSchema = 3,所以值会很大,但是最大值是100,所以超过了。
  • “我不知道这个数字是从哪里来的,因为我试图插入的工作表数据最多只包含 3 行加上一个标题” -- 你有没有实际上通过调试代码并检查DGVExcel.Rows.Count 返回什么来验证该假设?我还要指出(100 * 100) / 3(其中3 是您声明 MaxSchema 将设置为的)是3333,远高于@987654334 的默认MaxValue @。无论如何,除非您解决了您的问题,因此它包含一个可靠地重现问题的良好 minimal reproducible example,否则无法确定您的错误是什么。
  • (为了清楚起见,(100 * 100) / MaxSchema 来自DoWork 事件处理程序末尾的程序语句Transfer_Worker.ReportProgress(100);。)
  • 很高兴您能够解决问题。我觉得我不适合发布答案,因为坦率地说,我仍然不知道(100 * 100) / 3 是如何导致25500 的。如果你觉得你可以清理问题,所以它包含一个很好的minimal reproducible example,并且你可以自己发布一个答案(你可以自我接受),它完全和合乎逻辑地解释了错误以及如何修复它,你应该考虑这样做。
  • (处理更多行可以避免问题,因为你除以MaxSchema。行数足够时,计算结果很小,而2700000行数,结果是0,远低于默认最大值:)。要获得正确的结果,您可能应该在该行传递 MaxSchema 而不是 100。)

标签: c# winforms datagridview progress-bar outofrangeexception


【解决方案1】:

MaxSchema 的值远小于该值时,将默认值 (100) 分配给 TransferWorker 的 ReportProgress 属性会导致进度条值膨胀超过 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.`"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多