У меня есть пользовательский индикатор на главной форме (поток пользовательского интерфейса). Я создаю фоновый поток для чтения входных данных из файла CSV (по щелчку меню) и обновляю значение индикатора выполнения с помощью анонимного делегата. Все отлично работает только в первый раз.
Если я повторяю процесс чтения данных (из щелчка по меню), данные считываются так, как должны (я записываю их на консоль во время чтения), но индикатор выполнения вообще не отображается. Я что-то здесь упускаю?
По сути, индикатор выполнения работает только один раз, а затем не отображается, если я повторяю операцию чтения.
Любой совет будет принят с благодарностью. Спасибо.
Я использую код по существу от Уильяма Дэниела. Вот оно:
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 ().