C #: Winforms Progress Bar - PullRequest
       1

C #: Winforms Progress Bar

0 голосов
/ 22 ноября 2011

У меня есть пользовательский индикатор на главной форме (поток пользовательского интерфейса). Я создаю фоновый поток для чтения входных данных из файла 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 ().

1 Ответ

0 голосов
/ 22 ноября 2011

Прежде всего, убедитесь, что другой поток всегда обновляет индикатор выполнения с помощью метода Invoke .Я не уверен, что вы имели в виду «я обновляю значение индикатора выполнения с помощью анонимного делегата»?

Кроме того, вы не забыли сбросить позицию индикатора выполнения перед *второй запуск?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...