我的主窗体(UI线程)上有自定义进度条。我创建了一个后台线程来读取CSV文件中的输入数据(在菜单上单击),并使用匿名委托更新进度条的值。只有第一次,一切都很好。
如果我重复读取数据处理(从菜单点击),数据将按原样读入(我在读取时将其转储到控制台),但进度条根本不显示。我在这里错过了什么吗?
基本上,进度条只能运行一次,如果重复读取操作则不会显示。
任何建议都将不胜感激。谢谢。
我使用的代码主要来自William Daniel。这是:
class CustomProgressBar : ProgressBar
{
public CustomProgressBar()
{
this.SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// None... Helps control the flicker.
}
protected override void OnPaint(PaintEventArgs e)
{
const int inset = 2;
using (Image offscreenImage = new Bitmap(this.Width, this.Height))
{
using (Graphics offscreen = Graphics.FromImage(offscreenImage))
{
offscreen.Clear(Color.DarkBlue);
Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
if (ProgressBarRenderer.IsSupported)
ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);
rect.Inflate(new Size(-inset, -inset)); // Deflate inner rectangle
rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));
if (rect.Width == 0) rect.Width = 1;
LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0),
new Point(0, Height - inset * 2), BackColor, ForeColor);
offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);
e.Graphics.DrawImage(offscreenImage, 0, 0);
offscreenImage.Dispose();
}
}
}
}
使用代码是:
// ... update progress bar value
this.pBar.Invoke((MethodInvoker)delegate
{
this.pBar.Value = (int) ( ((double) nRows) * 100.0 / ((double) fileLines) );
});
我也使用this.pBar.Show()来显示它,我也使用this.pBar.Hide()隐藏它。