A arancibia
A arancibia

Reputation: 281

Adding percentage text to progressbar C#

I have a method that shows when a process bar is in execution and when is successfully completed.

I worked fine, but I would like to add a percentage showing a 100% if is complete and less if it got stuck some where.

I have made several research online but I could not adapt anything to the solution that I am looking for.

This is my code:

private void progressBar()
{
    int i;

    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;

    for (i = 0; i <= 100; i++)
    {
        progressBar1.Value = i;               
    }
}

I use the method call on my execution button by calling it with the follow:

progressBar();

Thanks

Upvotes: 4

Views: 30818

Answers (4)

Imad
Imad

Reputation: 59

int total = ;
int val = ;

double createDivider = total / 100;
int percent = val / createDivider;

this value (percent) is the right percent '%' of total

Upvotes: 0

Ismail Gunes
Ismail Gunes

Reputation: 558

If you use it as a part of backgroundworker it works perfectly I added a Label in the middle of the progressbar

And i added last row in my bgw_ProgressChanged method

    private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        p_bar.Value = e.ProgressPercentage;
        fnameLbl.Text = e.UserState.ToString();
        percentLbl.Text = "%" + (e.ProgressPercentage).ToString();
    }

ProgressPercentagevalue comes from the method below

        foreach (var item in filebox1)
        {
            System.IO.File.Move(item, Path.Combine(destdir, Path.GetFileName(item)));
            ++counter;
            int tmp = (int)((counter* 100) / totfiles);
            bgw.ReportProgress(tmp, "File transfered : " + Path.GetFileName(item));
            Thread.Sleep(100);
        }

Totfiles is the number of files that I get from server.

Thread.Sleep(100) let's you see for a short time what is displayed with fnameLbl.Text

Upvotes: 0

Hossein Shahdoost
Hossein Shahdoost

Reputation: 1742

In order to implement the progress in your operation, the operation's length must be calculated first. if it's not possible, you can't show a progress bar for that operation. (maybe only a loading gif)

but if so, There is an interface (IProgress) which can help you implement the progress reports.

First thing you should know, You must do the main task on another thread, and report the progress to the UI Thread. a simple example of this work would be something like this.

Progress.cs

public class Progress<T> : IProgress<T>
{
    private readonly Action<T> _progressAction;

    public Progress(Action<T> action)
    {
        _progressAction = action;
    }

    public void Report(T value)
    {
        _progressAction?.Invoke(value);
    }
}

Your code would be like this, in which the task starts after you click a button named ButtonBase

Progress<int> MyProgressObject { get; set; }

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    MyProgressObject = new Progress<int>(ProgressAction);
    ThreadPool.QueueUserWorkItem(TimeConsumingTask);
}

public void TimeConsumingTask(object state)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(100);
        MyProgressBar.Dispatcher.Invoke(() => ProgressAction(i));
    }
}

public void ProgressAction(int progress)
{
    MyProgressBar.Value = progress;
}

I know It might look difficult but this is the proper way of doing time consuming tasks and prevent UI block

Upvotes: 1

A arancibia
A arancibia

Reputation: 281

I have adjust the prograssBar method with the following lines.

The solution works.

Thanks

int percent = (int)(((double)progressBar1.Value / (double)progressBar1.Maximum) * 100);
            progressBar1.Refresh();
            progressBar1.CreateGraphics().DrawString(percent.ToString() + "%",
                new Font("Arial", (float)8.25, FontStyle.Regular),
                Brushes.Black,
                new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));

Upvotes: 2

Related Questions