猿问

进度条超过最大值

使用 ++ 操作递增值时,进度条超过最大值。在下面的代码中,我有一个大小为 6004 的记录集,当它绕过循环时,它设法达到 6006,即使我已经放置了一个 if 语句来捕获它,当它达到 value++ 以将进度条重置为零时隐藏面板。


    invoiceRecord = (SageDataObject240.InvoiceRecord)_workSpace.CreateObject(Resources.InvoiceRecord);



    pnlProgress.Visible = true;

    progBarSelectInvoices.Value = 0;

    progBarSelectInvoices.Maximum = invoiceRecord.Count;


    List<EdiInvoice> selectedInvoices = new List<EdiInvoice>();

    EdiInvoice invoice;


    DateTime fromDate = chkEnableFromDatePicker.Checked ? dtpFrom.Value.Date : DateTime.MinValue;

    DateTime toDate = chkEnableToDatePicker.Checked ? dtpTo.Value.Date : DateTime.MaxValue;

    int invoiceCount = 0;

    int progressCount = 0;

  int progresbarValue = 0;          

    int maxCount = invoiceRecord.Count + 1;

    while (invoiceRecord.MoveLast())

    {

        progresbarValue = progBarSelectInvoices.Value++;

        bool isPosted = (SDOHelper.Read<sbyte>(invoiceRecord, Resources.POSTED_CODE) == 1);


        if (isPosted)

        {

            int invoiceNo = SDOHelper.Read<int>(invoiceRecord, Resources.INVOICE_NUMBER);

            string invoiceCustomerReference = SDOHelper.Read<string>(invoiceRecord, Resources.ACCOUNT_REF);

            bool isValidCustomerReference = (invoiceCustomerReference == _selectedCustomer.Reference || _selectedCustomer.IncludeBranchInvoices && _selectedCustomer.BranchCodes.ContainsKey(invoiceCustomerReference));


            sbyte invoiceTypeCode = SDOHelper.Read<sbyte>(invoiceRecord, Resources.INVOICE_TYPE_CODE);

            bool isValidType = invoiceTypeCode >= 0 && invoiceTypeCode <= 5;


            string notes1 = SDOHelper.Read<string>(invoiceRecord, "NOTES_1");

            bool isExported = notes1.Length > 2 && notes1.Substring(0, 3).Equals("EDI", StringComparison.CurrentCultureIgnoreCase);


            DateTime invoiceDate = SDOHelper.Read<DateTime>(invoiceRecord, "INVOICE_DATE");

            bool isInDateRange = invoiceDate >= fromDate && invoiceDate <= toDate;



长风秋雁
浏览 551回答 1
1回答

噜噜哒

如果我们了解这里发生的事情,希望这将帮助您弄清楚这一点。让我们看看当您进入第 6003 个循环时会发生什么。我将假设progBarSelectInvoices.Value == 6002此时:这条线有什么作用?progresbarValue = progBarSelectInvoices.Value++;最后。progresbarValue == 6004和progBarSelectInvoices == 6003progresbarValue 永远不会再次使用,所以它可能只是被丢弃,但不确定然后我们跳过并做一堆其他的事情,然后点击这条线:progressCount = progBarSelectInvoices.Value;在这里progressCount == 6003 ,然后我们这样做:if (progressCount++ == maxCount || progressCount==invoiceCount)那么这里会发生什么,如果maxCount == 6004不是这个的第一部分 if 是falseBUT now progessCount == 6004。我们知道如果maxCount是 6004,那么invoiceCount == 6003(从这一行maxCount = invoiceRecord.Count + 1;),但现在progressCount == 6004这也是错误的。这意味着我们执行 else 部分。progBarSelectInvoices.Value++;progressCount= progBarSelectInvoices.Value++;这是做什么的?嗯,在第一行我们递增progBarSelectInvoices.Value,现在是 6004。然后我们移动到第二行,我们设置progressCount为 6004,但是我们再次递增进度条的值,所以现在是 6005。然后我们回到循环的顶部,我们做的第一件事是再次增加进度条,这将我们带到 6006。就个人而言,我尽量避免在 if 语句中使用 pre 或 post 递增语句,因为它会使代码难以阅读。在这种情况下,我绝对会建议不要这样做。如何修复解决此问题的一种方法 - 如果您确定您只有 6004 条记录,因此您只会执行该 while 循环 6004 次,然后执行此操作(注意,我建议您将增量移动到while 循环,以便您在指示进度之前实际完成工作)while (invoiceRecord.MoveLast()){&nbsp; &nbsp; // All your other code here&nbsp; &nbsp; progBarSelectInvoices.Value++;如果您想确保不超过最大值,您可以添加一个快速检查while (invoiceRecord.MoveLast()){&nbsp; &nbsp; // All your other code here&nbsp; &nbsp; if (progBarSelectInvoices.Value < progBarSelectInvoices.Maximum)&nbsp; &nbsp; &nbsp; &nbsp; progBarSelectInvoices.Value++;然后,您可以在检查 maxCount 并重置进度条或递增它的循环结束时取消 if/else 业务。旁注从该行的存在Application.DoEvents()以及在增加进度条值时您没有收到异常的事实,我偷偷怀疑您正在 UI 线程中执行此循环。每当您发现自己需要添加Application.DoEvents()事件处理程序代码时,这是问自己“如何将这项工作移出 UI 线程?”的好时机。打电话Application.DoEvents()几乎从来都不是一个好主意。看这里和这里您应该将该代码移动到后台线程中。唯一要记住的是,您需要使用调用调用来更新进度条值。
随时随地看视频慕课网APP
我要回答