Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
1

Изменение состояния progressBar по ходу выполнения метода

10.07.2019, 09:27. Показов 2336. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня имеется метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        private void updateDisplay()
        {
            //Если файл найден
                if (info.Exists)
                {
                    keyOption = new KeyOption(pathFile, dayPickerText, timePickerText, rbText, tbPost.Text, tbOven.Text, tbSmelting.Text, tbSteel.Text, tbSample.Text);
                    string[,] arrayGrid = keyOption.showElementsForGrid;
                    //Если данные есть, то вывести в гриде
                    if (arrayGrid.Length != 0)
                    {
                        dataGridView1.RowCount = arrayGrid.GetLength(0);
                        dataGridView1.ColumnCount = arrayGrid.GetLength(1);
                        for (int i = 0; i < arrayGrid.GetLength(0); i++)
                        {
                            for (int j = 0; j < arrayGrid.GetLength(1); j++)
                            {
                                dataGridView1.Rows[i].Cells[j].Value = arrayGrid[i, j];
                                //Изменение состояния progressBar'а
                            }
                        }
                    }
                    else
                    {
                        dataGridView1.Rows.Clear();
                        MessageBox.Show("Данные не найдены!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    dataGridView1.Rows.Clear();
                    MessageBox.Show("Файл по указанному пути не найден!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
        }
который заполняет dataGridView в форме. Вызывается по нажатию на кнопку.
Класс keyOption разбирает большой текстовый файл. По ключевым параметрам, указанным в форме пользователем в форме, отбирает строки. И выдает массив данных, которыми нужно заполнять dataGridView.

Из-за того, что файл действительно объемный (в среднем более 150000-200000 строк) хотелось бы, чтобы процесс выполнения всех действий можно было наблюдать на progressBar'е. Т.е. процесс от момента нажатия, до полной отрисовки результатов в dataGridView, чтобы отображался на progressBar'е.
Помогите кодом. Как это реализовать?


Заранее благодарю откликнувшихся.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2019, 09:27
Ответы с готовыми решениями:

Прерывание процедуры по ходу её выполнения
Здравствуйте, у меня есть программа...И я хочу сделать так чтобы по нажатии на крестик на форме у...

Изменение модуля по ходу выполнения кода
Добрый день, жители форума. Учусь питону и назрел, с моей точки зрения, интересный вопрос. Делаю...

Изменение содержания ресурсов по ходу выполнения программы
Собственно вопрос, могу ли я открыть файл из ресурсов на изменение? Например мне нужно изменить...

Изменение состояния прогресса в ProgressBar по таймеру
Всем доброго дня. Как можно связать эти 2 элемента, что бы прогрессбар отражал прогресс таймера....

9
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,846
10.07.2019, 14:08 2
Re_L Mayer,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                int step = 0;
                progressBar1.Maximum = arrayGrid.GetLength(0) * arrayGrid.GetLength(1);
                        for (int i = 0; i < arrayGrid.GetLength(0); i++)
                        {
                            for (int j = 0; j < arrayGrid.GetLength(1); j++)
                            {
                                dataGridView1.Rows[i].Cells[j].Value = arrayGrid[i, j];
                                this.Invoke(new Action(() =>
                                {
                                      progressBar1.Value = ++step;
 
                                }));
                            }
                        }
Попробуйте так.
0
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.07.2019, 14:37  [ТС] 3
Так то оно так. Состояние progressBar'а изменяется. Только оно отражает процесс отрисовки уже полученных значений на форме. Т.е. само заполнение dataGridView. А оно происходит достаточно быстро.

С момента нажатия на кнопку, до момента заполнения dataGridView проходит больше всего времени. И именно это хотелось бы отразить на progressBar'е.

/*Прошу прощения, если мой комментарий "//Изменение состояния progressBar'а" в коде Вас сбил. Просто я сама доходила до того же момента, что Вы показали. И поняла, что это не совсем то, что хотелось. */
0
es geht mir gut
11270 / 4752 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.07.2019, 14:51 4
Цитата Сообщение от Re_L Mayer Посмотреть сообщение
А оно происходит достаточно быстро.
Заполнение 200000 строк DGV происходит быстро ? Что-то не верится.
0
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.07.2019, 14:58  [ТС] 5
Мне далеко не всегда необходимо отображать все 200000 с лишним строк в dataGridView. Но чтобы понять сколько нужно все-таки, в любом случае нужно разобрать файл, состоящий из этих 200000 с лишним строк.

И я отсечки по времени делала. Потому и говорю, что с момента нажатия на кнопку до момента отрисовки у меня получалось по времени больше, нежели сама отрисовка занимала.

Добавлено через 1 минуту
В идеале бы суммировать время с момента нажатия до отрисовки и время самой отрисовки. И уже на основании этого двигать progressBar.
0
es geht mir gut
11270 / 4752 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.07.2019, 15:45 6
Цитата Сообщение от Re_L Mayer Посмотреть сообщение
Класс keyOption разбирает большой текстовый файл
Тогда вот в из этого класса и нужно двигать прогрессбар.
0
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
11.07.2019, 09:34  [ТС] 7
Каким образом? Он не видит его.
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
11.07.2019, 10:16 8
Re_L Mayer,
Используйте виртуальный режим датагрида. И прогресс бар не понадобится, все будет мгновенно.
А копирование массива в DGV - это антипаттерн в чистом виде.
0
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
11.07.2019, 10:21  [ТС] 9
Ничего не знаю о нем. Не могли бы кодом показать что к чему?
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
11.07.2019, 14:08 10
Re_L Mayer, в каком угодно классе есть метод

C#
1
2
3
4
5
6
7
8
9
10
    public static Task Method(IProgress<int> progress)
        {
            return Task.Run(() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    progress.Report(i);
                }
            });
        }
В форме

C#
1
2
3
4
5
6
7
8
9
10
11
12
  private void Button_Click(object sender, RoutedEventArgs e)
        {
            void Update(int i)
            {
                Console.WriteLine(i);
            }
 
            Progress<int> prog = new Progress<int>(Update);
 
            Method(prog);
 
        }
Добавлено через 1 минуту
Только это, сделайте через this.invoke, если нужен доступ к контролам, так как это не в UI потоке
0
11.07.2019, 14:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2019, 14:08
Помогаю со студенческими работами здесь

Progressbar ход выполнения метода
У меня есть большой метод, который создает БД. Как мне показать ход выполнения метода в ProgressBar?

Сохранение состояния объекта и хода выполнения метода
Доброй ночи Есть класс в php-скрипте который в ходе своего выполнения &quot;прерывает&quot; выполнение...

Изменение фактического состояния объекта не мгновенно по вызове метода, а через некоторое время
Хочу сделать чтобы после вызова метода объекта изменение состояния объекта происходило только через...

Изменение значение массива после выполнения метода
Здравствуйте. Есть массив $result, который не описанием класса. Нужно чтобы после того как метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru