C# ProgressBar重置为60%
我有以下代码:C# ProgressBar重置为60%,c#,progress-bar,C#,Progress Bar,我有以下代码: for(int k = 0; k<11; k++) { pBar.Maximum = 10; pBar.Value = k; if (pBar.Maximum == k) pBar.Value = 0; } for(int k=0;k 您的问题是您正在使用循环。您需要使用计时器,以便程序有时间执行检查/分配和更新屏幕 代码使用调用循环体的计时器替换for循环。由于计时器没有索引变量,因此它在计时器(计数)之外初始化,并随每个刻度更新
for(int k = 0; k<11; k++)
{
pBar.Maximum = 10;
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
for(int k=0;k
您的问题是您正在使用循环。您需要使用计时器,以便程序有时间执行检查/分配和更新屏幕
代码使用调用循环体的计时器替换for循环。由于计时器没有索引变量,因此它在计时器(计数)之外初始化,并随每个刻度更新。首先:没有任何理由在每个间隔上分配pBar.Maximum
。
只要做:
pBar.Maximum = 10;
for(int k = 0; k<11; k++)
{
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
pBar.max=10;
对于(int k=0;k如果切换到经典模式,此故障将消失。在重置之前,进度条将显示为完全绘制
这是因为在经典模式下,绘制操作是同步的,并且在<代码>值代码>设定器返回之前完成,但在主题模式下,增加值时会播放某种动画,这需要一些时间来播放
相反,如果减小该值,则不会出现动画;进度条会立即收缩
这就是为什么它看起来只有大约60%的满:在进度条有时间绘制最后几个增量的动画之前,您减少了该值(立即完成)。我终于找到了这个问题的解决方案,并就此进行了撰写。这个想法来源于这个问题
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;
有了这些代码,如果它是可见的,我会感到惊讶,因为你似乎没有让消息泵运行,并呈现任何更改。你在该循环中到底在做什么?我猜它实际上不是这样的?不幸的是,在一个主题化的界面(Windows XP主题及以上)中,这种情况经常发生。如果切换到经典模式,进度条将显示为完全填满。我不知道为什么会出现这种情况,但我也会遇到这种情况。@Groo,我正在根据列表添加一个sql行。我以前在foreach循环中有一个sql行,但它没有当前的索引值。@GSerg,这不会发生在我身上。它确实显示1或更高。我怀疑OP really在循环中完全不做任何事情。这会起作用,但我不会说使用计时器更新进度条是很常见的。因此,使用它,我如何从原始ForEach循环中添加代码,并在每次间隔后更新进度条?@CCInc用我提供的代码替换上面的代码。如果您有任何需要,请I’我想在循环中,使用count作为索引变量,将其写入Tick方法中。好的,这是可行的,但是我使用的是Sqlite数据库,每当我访问Tick内部的Sqlite连接时,连接状态是关闭的,而在Tick外部,连接状态是打开的。这是为什么?@CCInc这可能是因为计时器被调用了与连接不同的线程,这意味着在调用计时器时,连接已经关闭-您是否可以在计时器内部打开SqliteConnection?另外,关闭连接的代码在哪里?也许您可以将其移动到计时器中。
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;