【问题标题】:ProgressBar resets at 60%ProgressBar 重置为 60%
【发布时间】:2012-07-15 19:34:37
【问题描述】:

我有这个代码:

for(int k = 0; k<11; k++)
{
    pBar.Maximum = 10;
    pBar.Value = k;
    if (pBar.Maximum == k)
        pBar.Value = 0;
}

但是,问题是,进度条在大约 60% 满时会重置。如何确保进度条在重置之前一直填满?

【问题讨论】:

  • 使用该代码,如果它是可见的,我会感到惊讶,因为您似乎没有让消息泵运行并呈现任何更改
  • 你在那个循环中到底在做什么?我猜它实际上看起来不像这样?
  • 不幸的是,在主题界面(Windows XP 主题及更高版本)中一直发生这种情况。如果切换到经典模式,进度条将显示为已满。我不知道为什么会这样,但我也深受其害。
  • @Groo,我正在添加一个基于列表的 sql 行。我曾经在 foreach 循环中使用它,但它没有当前索引值。
  • @GSerg,这不会发生在我身上。它确实显示 1 或更高。

标签: c# progress-bar


【解决方案1】:

首先:没有任何理由将pBar.Maximum 分配给每个交互。 就这样吧:

pBar.Maximum = 10;
for(int k = 0; k<11; k++)
{
   pBar.Value = k;
   if (pBar.Maximum == k)
      pBar.Value = 0;
}

第二:你的代码导致阻塞迭代。它永远无法正确运行。使用多线程并根据一些event,tick 更改进度value,而不是循环,就像在这里完成的那样。

【讨论】:

    【解决方案2】:

    如果您切换到经典模式,此故障将消失。进度条在重置之前会显示为完全绘制。

    这是因为在经典模式下,绘画操作是同步的,并在Value setter 返回之前完成,但在主题模式下,当您增加值时会播放某种动画,这需要一些时间玩。

    相反,当你减少值时,没有动画;进度条立即缩小。

    这就是为什么它看起来只有大约 60% 的原因:您在进度条有时间绘制最后几个增量的动画之前减小值(立即完成)。

    【讨论】:

      【解决方案3】:
      pBar.Maximum = 10;
      int count = 0;
      
      Timer timer = new Timer();
      timer.Interval = 1000;
      timer.Tick += (source, e) =>
      {
          pBar.Value = count;
          if (pBar.Maximum == count)
          {
              pBar.Value = 0;
              timer.Stop();
          }
          count++;
      }
      timer.Start();
      

      您的问题是您正在使用循环。您需要使用计时器,以便程序有时间执行检查/分配和更新屏幕。

      代码将 for 循环替换为调用循环体的计时器。由于计时器没有索引变量,因此它在计时器之外进行初始化(计数)并随着每个滴答声更新。

      【讨论】:

      • 我怀疑 OP 在循环中真的什么都不做。这会起作用,但我不会说使用计时器更新进度条很常见。
      • 那么,使用这个,我将如何从我的原始 ForEach 循环中添加代码,并在每个 interarion 更新进度条之后?
      • @CCInc 将上面的代码替换为我提供的代码。如果您想在循环中执行任何操作,请将其写入 Tick 方法中,使用 count 作为索引变量。
      • 好的,这行得通,但是我使用的是 Sqlite 数据库,每当我访问 Tick 内的 SqliteConnection 时,连接状态都是关闭的,而在 Tick 之外,它是打开的。这是为什么呢?
      • @CCInc 这可能是因为定时器是在与连接不同的线程上调用的,这意味着在调用定时器时,连接已经关闭 - 您是否可以打开定时器里面的SqliteConnection?另外,关闭连接的代码在哪里?也许你可以把它移到计时器中。
      【解决方案4】:

      我终于找到了解决这个问题的方法,并写了here。这个想法来自THIS SO question。

           progressBar1.Value = e.ProgressPercentage;
           if (e.ProgressPercentage != 0)
               progressBar1.Value = e.ProgressPercentage - 1;
           progressBar1.Value = e.ProgressPercentage;
           if (progressBar1.Maximum == e.ProgressPercentage)
               progressBar1.Value = 0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多