C# 修复WinForms中的进度条

C# 修复WinForms中的进度条,c#,winforms,progress-bar,C#,Winforms,Progress Bar,问题是在进度条完成之前显示标签。如何使标签仅在进度条完全完成后才显示 我尝试将最大值更改为更高的数字,但没有成功 public partial class dload : Form { public dload() { InitializeComponent(); } private void dload_Load(object sender, EventArgs e) { label1.Visible = false;

问题是在
进度条
完成之前显示标签。如何使
标签仅在
进度条
完全完成后才显示

我尝试将最大值更改为更高的数字,但没有成功

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

    private void dload_Load(object sender, EventArgs e)
    {
        label1.Visible = false;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int i = 0;
        progressBar1.Minimum = 0;
        progressBar1.Maximum = 5000;
        for (i = 0; i <= 5000; i++)
        {
            progressBar1.Value = i;
            if (i == 5000)
            {
                label1.Visible = true;
            }
        }
    }
}
公共部分类加载:表单
{
公共数据加载()
{
初始化组件();
}
私有无效数据加载(对象发送方,事件参数e)
{
标签1.可见=假;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
int i=0;
progressBar1.最小值=0;
progressBar1.最大值=5000;

对于(i=0;i这是一个动画问题。围绕它的“hack”实际上是将进度值减少1:

progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (int i = 0; i < progressBar1.Maximum; i++) {
  progressBar1.Value = i;
  progressBar1.Value = Math.Max(i - 1, progressBar1.Minimum);
}
label1.Visible = true;
progressBar1.Minimum=0;
progressBar1.最大值=5000;
对于(int i=0;i
使用
progressBar1.刷新

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

private void dload_Load(object sender, EventArgs e)
{
    label1.Visible = false;
}

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 5000;
    for (i = 0; i <= 5000; i++)
    {
        progressBar1.Value = i;
        progressBar1.Refresh();
        if (i == 5000)
        {
            label1.Visible = true;
        }
    }
}
公共部分类加载:表单
{
公共数据加载()
{
初始化组件();
}
私有无效数据加载(对象发送方,事件参数e)
{
标签1.可见=假;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
int i=0;
progressBar1.最小值=0;
progressBar1.最大值=5000;

对于(i=0;i实际上,您的代码运行非常广泛,将值从0%设置为100%大约不到一秒钟!但是
ProgressBar
有两种显示当前状态的样式(
Classic
Continues

继续
模式下,如果进度值从0%变为100%,控件将显示一个动画,该动画不会显示真实和准确的进度。您可以通过
Thread.Sleep()
设置延迟,并在for循环后立即显示标签,以了解发生了什么

以下代码将起作用:

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 5000;
    for (i = 0; i <= 5000; i++)
    {
        Thread.Sleep(1);
        progressBar1.Value = i;

    }
    label1.Visible = true;
}
private void按钮1\u单击(对象发送者,事件参数e)
{
int i=0;
progressBar1.最小值=0;
progressBar1.最大值=5000;

对于(i=0;首先,您的循环将只运行到5000。您不需要在循环中使用
if
。删除while子句,只将
label1.Visible=true;
放在循环下面。现在,在您的情况下,progressbar已完成,但UI尚未完全更新它。我认为您可以将
progressBar1.Refresh()放在下面
更新值之后。edit只需运行此代码并了解您的意思。这很奇怪。需要调查并返回给您为什么不在“for”循环之后设置“label1.Visible=true;”呢?您不需要if语句。只需在循环之后移动label1.Visible即可。