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 volatile int currentNumber = 0;
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#进度条显示百分比的主要内容,如果未能解决你的问题,请参考以下文章

c# datagridview 绑定数据时逐行显示并且有进度条。问题如下:

C# 做一个播放音频文件的进度条该怎么实现呢??

你如何在 Windows 窗体上显示动画 GIF (c#)

C# winform加载子窗体很慢 如何用进度条显示

c#中的Web进度条

C#进度条怎么用 / C#progressBar的用法