c#进度条显示百分比
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#进度条显示百分比相关的知识,希望对你有一定的参考价值。
button1.Enabled = false;
button2.Enabled = false;
for(i=1;i<=100;i++)
for (j = 1; j<=10000; j++)
if (j % 100 == 0)
progressBar1.Value = j;
this.progressBar2.Value = i;
label3.Text = i.ToString() + "%";
button1.Enabled = true ;
button2.Enabled = true;
groupBox1.Text = "程序运行结束!";
timer1.Enabled=false;
我想在label3上显示进度百分比,但是只显示0%和100%,中间的数值显示不了,是什么原因,是因为没更新吗?
private void Form1_Load(object sender, EventArgs e)
//Form加载的时候启动一个手工线程.
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(NumberIncrement));
thread.Start();
//递增数字.
private void NumberIncrement()
for (int i = 0; i < 100; i++)
currentNumber += i;
//注意,当前方法由手工线程执行,无法直接对UI线程下的控件赋值.我们启用一个委托,跳回UI线程.
EventHandler eh = new EventHandler(DisplayNumber);
this.Invoke(eh, new object[] null, null );
//为了看到效果,这里可以加上
//Thread.Sleep(30);
private void DisplayNumber(object sender, EventArgs e)
//这里给UI控件赋值.
//比如 txtNumber.Text = currentNumber.ToString();
这是我给另外一个人写的代码,不过那人试都不原意试,你愿不愿意试下?
http://zhidao.baidu.com/question/79980016.html 参考技术A 不是因为没更新,而是程序的主线程也就是UI线程被你的循环卡住了
想要实现这个效果的话,应该把更新progressbar的操作放在一个工作线程里,用thread还是backgroundworker看你自己喜欢了
分不多,就不写代码了 参考技术B 不支持次线程调用主线程中控件的属性和方法,需要使用委托解决 参考技术C 这个一般都是模拟的不能真是反映出来的在WEB里面
你如何在 Windows 窗体上显示动画 GIF (c#)
【中文标题】你如何在 Windows 窗体上显示动画 GIF (c#)【英文标题】:How do you show animated GIFs on a Windows Form (c#) 【发布时间】:2010-09-15 00:14:16 【问题描述】:我有一个显示进度消息的表单,因为进程运行时间相当长。这是对 Web 服务的调用,所以我无法在进度条上有意义地显示完成百分比。 (我不是特别喜欢进度条的 Marquee 属性)
我想展示一个动画 GIF,让该过程具有某种活动的感觉(例如,文件从一台计算机传输到另一台计算机,如 Windows 复制过程)。
你是怎么做到的?
【问题讨论】:
对于动画图像,您可以使用此控制器。 codeproject.com/Tips/1004624/Gif-viewer-Snipper-control 【参考方案1】:这并不难。
-
将图片框拖放到表单上。
将 .gif 文件添加为图片框中的图像
加载时显示图片框。
需要考虑的事项:
禁用图片框将阻止 gif 动画。GIF 动画:
如果您正在寻找动画 gif,您可以生成它们:
AjaxLoad - Ajax Loading gif generator
另一种方法:
我发现另一种效果很好的方法是我在 code project 上找到的异步对话框控件
【讨论】:
非常简单!我最初的“谷歌搜索”没有显示这一点——也许太明显了。谢谢。 但是,图片框不会随着进程的执行而刷新(重绘)。 Durr,我错误地将其设置为背景图像。背景图像,合理地,不支持动画;前景图像。 @neminem:这里也一样!这就是我在这里的原因。有一段时间我认为pictureBox不支持fox gifs(我第一次使用它) @LarryBud 要使其在进程执行时刷新(重绘),您可以调用Application.DoEvents();
。可能的方法:您的业务逻辑在部分完成时触发一个事件,然后可以更新任何属性(例如进度条或百分比),并且可以使用 Application.DoEvents() 更新动画【参考方案2】:
Public Class Form1
Private animatedimage As New Bitmap("C:\MyData\Search.gif")
Private currentlyanimating As Boolean = False
Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Invalidate()
End Sub
Private Sub AnimateImage()
If currentlyanimating = True Then
ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
currentlyanimating = False
End If
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
AnimateImage()
ImageAnimator.UpdateFrames(animatedimage)
e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BtnStop.Enabled = False
End Sub
Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click
currentlyanimating = False
ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
BtnStart.Enabled = True
BtnStop.Enabled = False
End Sub
Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click
currentlyanimating = True
AnimateImage()
BtnStart.Enabled = False
BtnStop.Enabled = True
End Sub
End Class
【讨论】:
【参考方案3】:我遇到了同样的问题,并且通过实施我曾经面临几个不同的问题遇到了不同的解决方案。最后,下面是我将来自不同帖子的一些部分放在一起的内容,这些内容对我来说符合预期。
private void btnCompare_Click(object sender, EventArgs e)
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
这里是Execution方法,也带有调用PictureBox控件:
private void Execution()
btnCompare.Invoke((MethodInvoker)delegate pictureBox1.Visible = true; );
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate pictureBox1.Visible = false; );
请记住,PictureBox 在属性窗口中是不可见的,或者执行以下操作:
private void ComparerForm_Load(object sender, EventArgs e)
pictureBox1.Visible = false;
【讨论】:
【参考方案4】:我遇到了同样的问题。由于在后台工作的长时间操作,整个表单(包括 gif)停止重绘自身。这是我解决这个问题的方法。
private void MyThreadRoutine()
this.Invoke(this.ShowProgressGifDelegate);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.HideProgressGifDelegate);
private void button1_Click(object sender, EventArgs e)
ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
Thread myThread = new Thread(myThreadStart);
myThread.Start();
我只是创建了另一个线程来负责这个操作。多亏了这个初始形式,继续重绘没有问题(包括我的 gif 工作)。 ShowProgressGifDelegate 和 HideProgressGifDelegate 是表单中的代表,将带有 gif 的图片框的可见属性设置为真/假。
【讨论】:
【参考方案5】:当你开始一个长时间的操作时不会,因为你在同一个线程中,所以一切都停止了。
【讨论】:
就我在 *** 上阅读的内容而言,MTA 线程模式似乎是最糟糕的解决方案。【参考方案6】:请注意,在 Windows 中,您通常不使用动画 Gif,而是使用少量 AVI 动画:有一个 Windows 本机控件来显示它们。甚至还有工具可以将动画 Gif 转换为 AVI(反之亦然)。
【讨论】:
是的——也许这就是我应该问的。谢谢。 链接到工具,s'il vous plaît?或者对文档、原因等的任何其他参考都会很棒。谢谢! 我不关心编写传统的 Windows 软件。如果System.Windows.Forms.PictureBox
控件支持它,我将只使用动画 GIF。【参考方案7】:
如果你把它放在 PictureBox 控件中,它应该可以工作
【讨论】:
除非你禁用表单 ;)以上是关于c#进度条显示百分比的主要内容,如果未能解决你的问题,请参考以下文章