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

Производить вычисления в ячейках DGV по мере ввода данных

25.10.2012, 07:21. Показов 2531. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь - я создаю dataGridView, автоматом заполняю два первых столбца, в третий пользователь должен ввести значения, а в четвертом результаты вычислений, как сделать автоматическое обновление в dgv чтобы пользователь только ввел значения в третьем столбце и сразу же появились результаты в четвертом?

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

Вот такой код:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
        private void grid()
        {
 
            dataGridView1.Rows.Clear();
 
            this.dataGridView1.AllowUserToResizeRows = false;
            this.dataGridView1.MultiSelect = false;
            dataGridView1.AllowUserToAddRows = false;
 
            if (comboBox1.SelectedIndex > 1)
            {
                this.dataGridView1.Rows.Add("21,29", "32,56");
            }
 
            else
            {
                this.dataGridView1.Rows.Add("1018,87", "1557,67");
            }
 
            this.dataGridView1.Rows.Add("55,40", "81,88");
            this.dataGridView1.Rows.Add("0", "0");
            this.dataGridView1.Rows.Add("11,28", "14,43");
            this.dataGridView1.Rows.Add("9,93", "12,57");
            this.dataGridView1.Rows.Add("9,93", "12,57");
            this.dataGridView1.Rows.Add("9,93", "12,57");
            this.dataGridView1.Rows.Add("2,28", "2,65");
            this.dataGridView1.Rows.Add("2,40", "0");
            this.dataGridView1.Rows.Add("1,3", "0");
            this.dataGridView1.Rows.Add("2,28", "2,65");
            this.dataGridView1.Rows.Add("48,35", "62,15");
        }
 
 
        private void math()
        {
            int i = 0;
            while (i < 12)
            {
            string heating_2010_string = dataGridView1.Rows[i].Cells[0].Value.ToString();
            double heating_2010 = Convert.ToDouble(heating_2010_string);
 
            string heating_2012_string = dataGridView1.Rows[i].Cells[1].Value.ToString();
            double heating_2012 = Convert.ToDouble(heating_2012_string);
 
            double sum_heating = ((heating_2012) - ((heating_2010) * 115 / 100));
            sum_heating = Math.Round(sum_heating, 2);
            dataGridView1.Rows[i].Cells[3].Value = Convert.ToString(sum_heating);
            i++;
            }
        }
 
        private void calculations_Load(object sender, EventArgs e)
        {
            ControlBox = false;
            comboBox1.SelectedIndex = 6;
            comboBox2.SelectedIndex = 0;
 
            grid();
            grid_header();
            math();
 
        }
Значения из третьего столбца я пока не брал, т.к. нет обновления таблицы
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2012, 07:21
Ответы с готовыми решениями:

Поиск в DGV по мере ввода
Всем привет, подскажите как сделать поиск что бы по мере вода имени в textbox выбиралась строка в datagridviver с похожим именем?

Вывод данных (сортировка) по мере ввода поисковых значений
Добрый день уважаемые форумчане! Прошу вашего совета для решения проблемы следующего характера: Работаю с БД...

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

27
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.10.2012, 09:47
http://msdn.microsoft.com/ru-r... s.90).aspx
0
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
25.10.2012, 09:52  [ТС]
я находил - 1й результат поиска гугла
как в моей ситуации это применить? я не могу вьехать
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.10.2012, 09:57
na1anya, событие позволяет выяснить, в какой ячейке произошло изменение (через е). Соответственно можно изменить зависимое значение.
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 08:35  [ТС]
примерно так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            Update();
        }
        
        private void Update()
        {
            int stroki;
            for (stroki = 0; stroki < 12; stroki++)
            {
                string znach = dataGridView1.Rows[stroki].Cells[2].Value.ToString();
                dataGridView1.Rows[stroki].Cells[3].Value = znach;
            }
        }
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 10:09
Цитата Сообщение от na1anya Посмотреть сообщение
примерно так?
Нет. Вот так
C#
1
2
3
4
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            dataGridView1[e.ColumnIndex, e.RowIndex].Value = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString() + (int)dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
        }
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 11:04  [ТС]
а как применить на конкретном примере?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 11:50
Цитата Сообщение от na1anya Посмотреть сообщение
а как применить на конкретном примере?
это я сразу что-то не то с индексами показал Нужно так
C#
1
2
3
4
5
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex==1 || e.ColumnIndex==2)
                  dataGridView1[3, e.RowIndex].Value = dataGridView1[1, e.RowIndex].Value.ToString() + dataGridView1[2, e.RowIndex].Value.ToString();
        }
Объединяет значения 2-й и 3-й ячейки (если в них произошло изменение) и отображает их в 4-й.
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 12:03  [ТС]
а как вызывать?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 12:26
Цитата Сообщение от na1anya Посмотреть сообщение
а как вызывать?
что значит вызывать? Это событие, оно само вызовется, когда произойдет изменение в ячейке.
na1anya, ты умеешь с событиями работать?
0
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 12:45  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
Это событие, оно само вызовется, когда произойдет изменение в ячейке.
скопировал твой код, результата нет ни какого..


Цитата Сообщение от nio Посмотреть сообщение
ты умеешь с событиями работать?
я ток учусь(
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
26.10.2012, 12:48
рано тогда переходить на WinForms, сначала изучить всё по объектно-ориентированному программированию, делегатам и событиям на консоле...
0
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 12:55  [ТС]
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
рано тогда переходить на WinForms
Ну не знаю, на самом деле то что в данный момент мне требовалось я спокойно делал, почитывая то тут, то там. Практически на все вопросы есть уже готовые ответы, сейчас первый раз столкнулся чтобы не описано где-то было..
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 13:21
na1anya, краткое введения в события.
У всех (или почти всех) элементов управления есть события, которые происходят при каких-либо действиях с этими элементами управления (нажатие по кнопке это тоже событие). В коде все организуется таким образом, что событие вызывает некий метод (для примера с кнопкой это button_Click).

Для просмотра событий, которые может генерировать элемент управления:
1) выдели его в дизайнере
2) в окне свойств выбери отображение событий (Events).
3) списке событий выбери нужное (в твоем случае нужно выбрать событие CellValueChanged). Двойной клик по пустому полю рядом с событием создаст новый метод обработки (можно выбрать из списка уже существующий).
Миниатюры
Производить вычисления в ячейках DGV по мере ввода данных  
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 13:34  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
краткое введения в события.
Большое спасибо! Полезная инфа.

теперь на
C#
1
2
3
4
5
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2)
            dataGridView1[3, e.RowIndex].Value = dataGridView1[1, e.RowIndex].Value.ToString() + dataGridView1[2, e.RowIndex].Value.ToString();
        }
полетела ругань
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
вроде индексы не отрицательные и меньше размера коллеции
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 13:47
поставь точку останова на строке 2. и в момент срабатывания события проверь значения в e.RowIndex и e.ColumnIndex. Ну и конечно в dgv должно быть как минимум 4 столбца

Добавлено через 2 минуты
Можно добавить такую проверку (проблема скорее всего с индексом строки)
C#
1
2
3
4
5
6
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if(e.RowIndex < 0 || e.RowIndex > dataGridView1.RowCount) return;
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2)
            dataGridView1[3, e.RowIndex].Value = dataGridView1[1, e.RowIndex].Value.ToString() + dataGridView1[2, e.RowIndex].Value.ToString();
        }
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
26.10.2012, 13:48  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
e.RowIndex и e.ColumnIndex
e.RowIndex = -1, на это и ругается, а почему так может быть?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.10.2012, 13:51
Цитата Сообщение от na1anya Посмотреть сообщение
e.RowIndex = -1, на это и ругается, а почему так может быть?
ну тут следует учитывать в какой момент времени происходит срабатывание. Скорее всего в момент создания строки, когда она еще не состоит в коллекции dgv.Rows. Проверку и решение я показал выше.
1
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
27.10.2012, 12:16  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
Проверку и решение я показал выше.
Большое спасибо!

Я к примеру писал про сложения, немного другие вычисления нужны были:
cell3 = cell1 * cell2 - cell0 * cell2 * 115 / 100 ;

плюс ко всему значения должны были быть double,
что из этого вышло (мб кому-то пригодится):

C#
1
2
3
4
5
6
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0 || e.RowIndex > dataGridView1.RowCount) return;
            if (e.ColumnIndex == 0 || e.ColumnIndex == 1 || e.ColumnIndex == 2)
                dataGridView1[3, e.RowIndex].Value = (double.Parse(dataGridView1[1, e.RowIndex].Value.ToString())) * (double.Parse(dataGridView1[2, e.RowIndex].Value.ToString())) - (double.Parse(dataGridView1[0, e.RowIndex].Value.ToString())) * (double.Parse(dataGridView1[2, e.RowIndex].Value.ToString())) * 115 / 100;
        }
0
1 / 1 / 0
Регистрация: 24.09.2012
Сообщений: 44
28.10.2012, 21:42  [ТС]
а как сумму столбца №3 выводить в textbox по мере введения значений в dgv?

Добавлено через 1 час 36 минут
я добавил в CellValueChanged

C#
1
2
3
            double sumi = double.Parse(dataGridView1[3, e.RowIndex].Value.ToString());
            sumi = Math.Round(sumi, 2);
            textBox1.AppendText(Convert.ToString(sumi));
но выводится почему-то два значения записанных подряд - если в 3й колонке появится 10,15 то в текстбоксе будет 10,1510,15

это, я понимаю из-за переменной типа стринг.
п.с.: если в 3м столбце будет дальше появляться значение, то оно будет прибавляться к строке.

почему 2 раза? как исправить?

Добавлено через 20 минут
Цитата Сообщение от na1anya Посмотреть сообщение
почему 2 раза?
исправил

Добавлено через 31 минуту
по идее, так должно работать:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0 || e.RowIndex > dataGridView1.RowCount) return;
            if (e.ColumnIndex == 0 || e.ColumnIndex == 1 || e.ColumnIndex == 2)
            {
                dataGridView1[3, e.RowIndex].Value =
                       (double.Parse(dataGridView1[1, e.RowIndex].Value.ToString())) * (double.Parse(dataGridView1[2, e.RowIndex].Value.ToString())) -
                       (double.Parse(dataGridView1[0, e.RowIndex].Value.ToString())) * (double.Parse(dataGridView1[2, e.RowIndex].Value.ToString())) * 128.8 / 100;
 
                this.Controls.OfType<TextBox>().All(x => (x.Text = string.Empty) == string.Empty);
                double result = 0;
                double sumi = double.Parse(dataGridView1[3, e.RowIndex].Value.ToString());
                sumi = Math.Round(sumi, 2);
                result = result + sumi;
                textBox1.AppendText(Convert.ToString(result));
            }
        }
но текстбокс показывает просто результат вычисления в 4й ячейке после записи значения в 3ю, а не сумму столбца как должен..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2012, 21:42
Помогаю со студенческими работами здесь

Выравнивание текста в ячейках DGV
Просто выводи почему - то зеркально :(=-O

Как работать с CheckBox в ячейках DGV
Хочу сделать что бы при нажатия чекбокса в гриде, менялся цвет ячейки. Все значения (true, false) хранятся в базе данных!

Суммирование значений в ячейках двух полей DGV
Помогите сделать так что бы когда жму на кнопку то из поля Остаток прибавляло число к полю Начислено следующего месяца.

Ссылки в ячейках DGV с переходом на форму с данными выбранной строки
Здравствуйте, такая задача есть таблица1 с полями (Фирма, адрес, телефон и т.д) при нажатие на любую запись из таблицы, открывается...

Перенос данных из одного DGV в другой DGV
Нужно перенести данные из одного dgv в другой(в идеале ещё прибавить к столбцам выбранные значения из текстбокса). DGV-хи находятся на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru