在C#中向进度条添加百分比文本

4

我有一个方法,可以显示进程栏何时在执行以及何时成功完成。

它运作良好,但我想添加一个百分比,如果完成了就显示100%,如果卡在某个地方,则显示较低的百分比。

我在网上进行了多次研究,但是我无法将任何内容调整为我正在寻找的解决方案。

这是我的代码:

private void progressBar()
{
    int i;

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

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

我通过以下方式在执行按钮上调用方法:

progressBar();

谢谢


1
如果不需要更新UI或执行一些长时间运行的操作,那么你的for循环是没有必要的,你可以直接编写progressBar1.Value = 100,这可能是在发布模式下进行优化的。 - Ron Beyer
另外,我假设这是一个WinForms项目?您是否想要在某个地方添加一个标签,以显示相同的进度条值? - Ron Beyer
@RonBeyer。谢谢你的回复。事实上,我已经改变了第一个建议,你是对的,for循环是不必要的。其次,这是一个Windows窗体,我想在进度条上添加一个标签来显示进度值。谢谢。 - A arancibia
1
尝试使用progressBar1.CreateGraphics().DrawString(您的配置)。 - ivamax9
@Chase 谢谢你,你是对的。我会提交我的解决方案。它起作用了。 - A arancibia
这个实现是错误的,当 i = 100 时,你怎么知道任务已经完成了? - Hossein Shahdoost
4个回答

2
我已经使用以下代码调整了progressBar方法。
解决方案有效。
谢谢。
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));

这只更新进度条,您的表单的其余部分将被阻止。 - Hossein Shahdoost
@HosseinShahdoost,您能告诉我如何根据您的建议进行更改吗?谢谢。 - A arancibia
@HosseinShahdoost 我有另一种方法,可以将数据导入到数据库中。在主方法结束时,我想指示进度状态栏。 - A arancibia

1
为了在您的操作中实现进度,必须先计算操作的长度。如果不可能,您将无法为该操作显示进度条(也许只有一个加载gif)。
但是如果可以,有一个接口(IProgress)可以帮助您实现进度报告。
首先您应该知道,必须在另一个线程上执行主任务,并将进度报告给UI线程。这项工作的简单示例可能如下所示。

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);
    }
}

您的代码将像这样,在其中任务在单击名为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;
}

我知道看起来可能很困难,但这是处理耗时任务和防止UI阻塞的正确方式。


0

如果您将其作为后台工作者的一部分使用,它将完美地工作。 我在进度条中间添加了一个标签

并且我在我的bgw_ProgressChanged方法中添加了最后一行。

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

ProgressPercentagevalue来自下面的方法

        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是我从服务器获取的文件数量。

Thread.Sleep(100)让您短暂地看到fnameLbl.Text所显示的内容。


0
int total = ;
int val = ;

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

这个值(百分比)是总数的正确百分比 '%'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接