Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Изменение значения progressbar'a из backgroundwork


Автор: medicdim 25.2.2010, 13:04
Вопрос в следующем:
Т.к. база данных довольно большая и запросы могут выполняться достаточно долго есть необходимость информировать пользователя о том, что работа идёт.
Вот код заполнения грида:
Код

            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "select top "+ txtPerPage.Text +" tel_number, short_name, surname, name, last_name, region, city "+
            "from data where region='"+drdRegion.SelectedItem.ToString()+"' and is_processed=0";
            cmd.Connection = conn;
            cmd.CommandTimeout = cmd.CommandTimeout * 100;
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                TCity = (string)reader[6];

                dataGridView1.Rows.Add(SearchCode(TCity)+reader[0].ToString(), reader[1], reader[2], reader[3],
                    reader[4], reader[5], reader[6]);
            }
            conn.Close();


Пытаюсь сделать следующим образом:

Код

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 1000; i++)
            {
                backgroundWorker1.ReportProgress(i);
                Thread.Sleep(2);
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                if (i == 999) i = 0;
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //this.progressBar1.Value = e.ProgressPercentage;
            this.progressBar1.Invoke(new MethodInvoker(delegate()
            {
                progressBar1.Value = e.ProgressPercentage;
            }));
        }


Но в процессе выполнениия запроса и заполнения грида форма со всеми контролами лочится и отображение progressBar'а не меняется.
Как мне сделать так, чтобы эти изменения происходили.
Зарание спасибо!

Автор: Fortnox 25.2.2010, 16:10
medicdim, заполнять грид в другом потоке? Например в потоке BackgroundWorker.

Автор: medicdim 25.2.2010, 17:02
Спасибо. Тоже вариант. Как сделаю отпишусь по результату.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)