使用一个窗体表单来增加另一个窗体的进度条

时间:2015-08-17 18:18:41

标签: c# winforms

我只是想知道我是否有表单Form1,并声明

public partial class Form1 : Form
{
   GraphLoadProgress loadProgress;

   public Form1()
   {
      loadProgress = new GraphLoadProgress();
      loadProgress.Show();
      // do some stuff
      loadProgress.progress = 25; // increment by 25%
      // more stuff 
      for (int i = 0; i < 65; i++) // increment by 65%
      {
         loadProgress.progress = 1;
      }
      // even more stuff
      loadProgress.progress = 10; // increment by 10%

      // blah blah
      loadProgress.progress = 100; // make sure it goes over 100%
   }
}

在我的GraphLoadProgress表单中是以下

public partial class GraphLoadProgress : Form
{
    public int progress { get; set; }

    private void StartBackgroundWork()
    {
        if (Application.RenderWithVisualStyles)
            progressBar.Style = ProgressBarStyle.Marquee;
        else
        {
            progressBar.Style = ProgressBarStyle.Continuous;
            progressBar.Maximum = 100;
            progressBar.Value = 0;
            timer1.Enabled = true;
        }
        //backgroundWorker.RunWorkerAsync();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (progressBar.Value > progressBar.Maximum)
            this.Close();
        progressBar.Increment(progress);
    }
}

这显然不起作用,因为即使我不想要它,计时器也会更新和增加,有没有办法增加进度条,只在进度条仍在更新时增加一定量?

1 个答案:

答案 0 :(得分:1)

您可以直接使用progress属性的setter,例如:

private int _progress = 0;
public int progress {
    get { return _progress; }
    set {
        _progress = value;
        if (progressBar.InvokeRequired) {
            this.Invoke((MethodInvoker) delegate {progressBar.Value == value;});
        } else {
            progressBar.Value = value;
        }
    }
}

通过这种方式,您可以从外部设置进度条的值。 InvokeRequired检查使得可以从不同的线程设置值。

更接近地模仿你的行为将是一个WriteOnly属性(只有一个setter):

public int progress {
    set {
        if (progressBar.InvokeRequired) {
            this.Invoke((MethodInvoker) delegate {progressBar.Increment(value);});
        } else {
            progressBar.Increment(value);
        }
    }
}

您也可以随时向表单添加公共Increment方法。

public void IncrementProgress(int Value)
{
    if (progressBar.InvokeRequired) {
        this.Invoke((MethodInvoker) delegate {progressBar.Increment(Value);});
    } else {
        progressBar.Increment(Value);
    }
}

您应该在任何情况下添加最大值的检查,以避免例外。