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

本文关键字:窗体 增加 另一个 窗口 一个 | 更新日期: 2023-09-27 18:08:26

我只是想知道如果我有一个表单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);
    }
}

这显然不起作用,因为计时器会更新和增加,即使我不希望它,是否有任何方法来增加进度条,只增加一定数量,而进度条仍在更新?

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

您可以直接使用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);
    }
}

您应该在任何情况下添加对最大值的检查,以避免出现异常。