为了账号安全,请及时绑定邮箱和手机立即绑定

进度条超过最大值

进度条超过最大值

C#
长风秋雁 2022-01-09 16:31:45
使用 ++ 操作递增值时,进度条超过最大值。在下面的代码中,我有一个大小为 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;
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

如果我们了解这里发生的事情,希望这将帮助您弄清楚这一点。让我们看看当您进入第 6003 个循环时会发生什么。我将假设progBarSelectInvoices.Value == 6002此时:


这条线有什么作用?


progresbarValue = progBarSelectInvoices.Value++;

最后。progresbarValue == 6004和progBarSelectInvoices == 6003


progresbarValue 永远不会再次使用,所以它可能只是被丢弃,但不确定


然后我们跳过并做一堆其他的事情,然后点击这条线:


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())

{

    // All your other code here

    progBarSelectInvoices.Value++;

如果您想确保不超过最大值,您可以添加一个快速检查


while (invoiceRecord.MoveLast())

{

    // All your other code here

    if (progBarSelectInvoices.Value < progBarSelectInvoices.Maximum)

        progBarSelectInvoices.Value++;

然后,您可以在检查 maxCount 并重置进度条或递增它的循环结束时取消 if/else 业务。


旁注

从该行的存在Application.DoEvents()以及在增加进度条值时您没有收到异常的事实,我偷偷怀疑您正在 UI 线程中执行此循环。每当您发现自己需要添加Application.DoEvents()事件处理程序代码时,这是问自己“如何将这项工作移出 UI 线程?”的好时机。打电话Application.DoEvents()几乎从来都不是一个好主意。看这里和这里


您应该将该代码移动到后台线程中。唯一要记住的是,您需要使用调用调用来更新进度条值。


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 550 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信