Shailesh Bhat
Shailesh Bhat

Reputation: 152

How to use progressbar.value property at different locations of program

I need to use progressbar.value property at different locations. But the problem is, while executing it shows only maximum value given. I need to stop at 25% and 75% and after some delay, 100%. How can I overcome this problem. Thanks in Advance...

C#

namespace ProgressBarWindowForm
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, System.EventArgs e)
        {
            label1.Hide();
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 25;

            if (progressBar1.Value == 25)
            {
                label1.Show();
                label1.Text = "Process Complete 25%";
            }
            progressBar1.Value = 75;

            if (progressBar1.Value == 75)
            {
                label1.Show();
                label1.Text = "Process Complete 75%";
            }
       }
   }
}

Progressbar control name is progressBar1, Label name is label1 and Button name is button1 When I Clicked the Button, progressbar value is directly filling with 75%. I want to stop it at 25% and after some delay it should fill 75% and then 100%...Can anyone help..Can I use "progressBar1.value" only Once or as many times I need?

My form looks like this

Upvotes: 0

Views: 2655

Answers (4)

Abinash
Abinash

Reputation: 481

try this,Drag and drop background worker in windows form

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

    backgroundWorker1.WorkerReportsProgress = true;
    // This event will be raised on the worker thread when the worker starts
    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    // This event will be raised when we call ReportProgress
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
   }
  private void button1_Click(object sender, EventArgs e)
  {
    // Start the background worker
    backgroundWorker1.RunWorkerAsync();
  }
// On worker thread so do our thing!
  void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Your background task goes here
        for (int i = 0; i <= 100; i++)
        {
            // Report progress to 'UI' thread
            backgroundWorker1.ReportProgress(i);
            // Simulate long task
            if (label1.InvokeRequired)
            {
                label1.Invoke(new MethodInvoker(delegate
                {
                    label1.Show();
                    label1.Text = "Process Complete " + progressBar1.Value + "%";
                }));
            }
            if (progressBar1.Value == 25 || progressBar1.Value == 75)
            {
                System.Threading.Thread.Sleep(1000);
            }
            System.Threading.Thread.Sleep(100);
        }
    }
// Back on the 'UI' thread so we can update the progress bar
  void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
   {
    // The progress percentage is a property of e
    progressBar1.Value = e.ProgressPercentage;
   }
 }

Upvotes: 1

sujith karivelil
sujith karivelil

Reputation: 29036

Its simple to update progressBar values in button click, you can initialize the properties in the page load or else use the designer, in page load it would be like the following:

private int ProgressPercentage = 10;
public void Form1_Load(object sender, System.EventArgs e)
{
     progressBar1.Minimum = 0;
     progressBar1.Maximum = 100;
     progressBar1.Value = 0;
}

So the initialization completed, now you can code the button click like the following, through which you can update the progress bar in every button click:

private void button1_Click(object sender, EventArgs e)
{
     progressBar1.Value += ProgressPercentage;
     label1.Text = String.Format("Process Complete {0}%",progressBar1.Value);
}

If you want the update to be happens automatically in a particular interval means you can make use of a timer and enable the timer in the button click. Here you can find a similar thread which can be used to implement timer to your scene.

Update as per your comment, calling a delay will not be a best practice, you can make use a timer here as like the following:

System.Windows.Forms.Timer proTimer = new System.Windows.Forms.Timer();
private void Form1_Load(object sender, EventArgs e)
{
    proTimer.Interval = 1000;
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    proTimer.Tick += new EventHandler(proTimer_Tick);
}
private void button1_Click(object sender, EventArgs e)
{
    proTimer.Enabled = true;
    proTimer.Start();
}

// Timer event
void proTimer_Tick(object sender, EventArgs e)
{
     progressBar1.Value += ProgressPercentage;
     label1.Text = String.Format("Process Complete {0}%",progressBar1.Value);        
     if (progressBar1.Value == 100)
     {
        proTimer.Stop();
        proTimer.Enbled = false;
     }
}

Upvotes: 1

adjan
adjan

Reputation: 13684

Use a Timer to update the progress bar after a delay:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        timer.Tick += Timer_Tick;
        timer.Interval = 1000; // delay: 1000 milliseconds
    }

    Timer timer = new Timer();

    private void Timer_Tick(object sender, EventArgs e)
    {
        if (progressBar1.Value == 100)
        {
            timer.Stop();
            return;
        }
        progressBar1.Value += 25;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        progressBar1.Value = 25;
        timer.Start();
    }
}

Upvotes: 1

AlterionX
AlterionX

Reputation: 81

You need to add a delay inbetween the changes. As of now, the button advance the bar to 25, sets the label, then advances the bar to 75 without pausing.

System.Threading.Thread.Sleep(n); will sleep n milliseconds, which you will need after the statement setting the 25 percent marker.

EDIT

If you want it the value to only progress on a button click, you will need to check the value of the progress bar before you advance it.

In pseudo code, something like:

onclick() {
    if (progress == 0) {
        progress = 25
        label = the25MarkText
    } else if (progress == 25) {
        progress = 75
        label = the75MarkText
    }
}

Upvotes: 0

Related Questions