How to use ProgressBar in C#?

I want to use the ProgressBar and run it from 100% to 0% within 2 seconds. I have written the following function but it does not seem to run properly. Please help! Thank you!

private async void progessbar()
{
    for (iValue = 100; iValue >= 0; iValue--)
    {
        pbTime.Value = iValue;
        await Task.Delay(20);
    }
}

Upvotes: 1

Views: 818

Answers (3)

Kevin Gosse
Kevin Gosse

Reputation: 39007

If you want to animate your progress bar smoothly, you should use a storyboard:

private void AnimateProgressBar()
{
    var storyboard = new Storyboard();

    var animation = new DoubleAnimation { Duration = TimeSpan.FromSeconds(2), From = 100, To = 0, EnableDependentAnimation = true };

    Storyboard.SetTarget(animation, this.ProgressBar);
    Storyboard.SetTargetProperty(animation, "Value");

    storyboard.Children.Add(animation);

    storyboard.Begin();
}

Upvotes: 4

Himanshu Singh
Himanshu Singh

Reputation: 84

I hope this helps

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

private void Form1_Load(object sender, System.EventArgs e)
{
    // Start the BackgroundWorker.
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    /*Your main code*/
    for (int i = 1; i <= 100; i++)
    {
    // Wait 20 milliseconds.
    Thread.Sleep(20);
    // Report progress.
    backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    // Set the text.
    this.Text = e.ProgressPercentage.ToString();
}
}

}

Upvotes: 0

Ernst K
Ernst K

Reputation: 41

You are changing toolbar multiple times in the same Windows event. Windows updates GUI later when it is idle. Thus you probably see your toolbar jump from 0 to 100% after 2 second wait.

Just add timer to your control, set it when ready to start and do incremental updates.

// In your designer:
this.timer.Enabled = false;
this.timer.Interval = 200;
this.timer.Tick += new System.EventHandler(this.timer_Tick);

// when starting the progress:  
pbTime.Value = 0
this.timer.Enabled = true; 

private void timer_Tick(object sender, EventArgs e)
{
    if (pbTime.Value < 100)
        pbTime.Value += 10;

}

Upvotes: 0

Related Questions