使用一个窗口窗体来增加另一个窗体的进度条
本文关键字:窗体 增加 另一个 窗口 一个 | 更新日期: 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);
}
}
您应该在任何情况下添加对最大值的检查,以避免出现异常。