【问题标题】:Adding percentage text to progressbar C#将百分比文本添加到进度条 C#
【发布时间】:2015-11-19 16:36:22
【问题描述】:

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

我工作得很好,但我想添加一个百分比,如果完成则显示 100%,如果卡在某个地方则更少。

我在网上做了几项研究,但我无法根据我正在寻找的解决方案做出任何调整。

这是我的代码:

private void progressBar()
{
    int i;

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

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

我在执行按钮上使用方法调用,方法如下:

progressBar();

谢谢

【问题讨论】:

  • 不更新 UI 或做一些长时间运行的操作,你的 for 循环是不必要的,你可以写 progressBar1.Value = 100,这可能是它在发布模式下优化的内容。跨度>
  • 另外,我假设这是一个 winforms 项目?您想在某处添加一个标签,该标签也显示相同的进度条值吗?
  • @RonBeyer。感谢您的答复。事实上,我已经改变了第一个建议,你是对的,for 循环是不必要的。其次,它是一个 Windows 窗体,我还想为进度条值添加一个标签。谢谢
  • 尝试使用progressBar1.CreateGraphics().DrawString(你的配置)
  • @Chase 谢谢你是对的。我将提交我的解决方案。成功了

标签: c# progress-bar windows-forms-designer percentage


【解决方案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 阻塞的正确方法

【讨论】:

    【解决方案2】:

    我已经用以下几行调整了 prograssBar 方法。

    解决方案有效。

    谢谢

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

    【讨论】:

    • 那只会更新进度条,你的表单的其余部分会被阻塞
    • @HosseinShahdoost,您能告诉我如何根据您的建议进行更改吗?谢谢
    • @HosseinShahdoost 我有另一种方法是将数据导入数据库在主要方法的末尾我想指示进度状态栏
    【解决方案3】:

    如果您将它用作 backgroundworker 的一部分,它可以完美运行 我在进度条中间加了一个Label

    我在我的 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 显示的内容

    【讨论】:

      【解决方案4】:
      int total = ;
      int val = ;
      
      double createDivider = total / 100;
      int percent = val / createDivider;
      

      这个值(百分比)是总数的正确百分比“%”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        相关资源
        最近更新 更多