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

Как показать в label ID номера из datagridview те строки которые закрашены

04.09.2021, 11:29. Показов 3830. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет Всем!

Не могу разобратся как можно в лабел показать те ИД номера которые в датагрид закрашенны в красный цвет.

Нажимая на кнопку у меня пишется дубликаты и если такие есть то строки окрашивается в красный цвет.

Хочу в лабел чтобы показала какие ИД строки были закрашены
Вот сам код:

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
private void button74_Click(object sender, EventArgs e)
{
for (int currentRow = 0; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
{
DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow];
for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count; otherRow++)
{
DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
bool duplicateRow = true;
if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
{
duplicateRow = false;
}
if (duplicateRow)
{
rowToCompare.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
rowToCompare.DefaultCellStyle.ForeColor = System.Drawing.Color.Black;
int countRed = 0;
foreach (DataGridViewRow row1 in advancedDataGridView15.Rows)
{
if (row1.DefaultCellStyle.BackColor == System.Drawing.Color.Red)
countRed++;
 
}
label133.Text = $"Найденны {countRed} Дубликаты";
//label134.Text = ?????
 
}
}
}
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2021, 11:29
Ответы с готовыми решениями:

Скрыть/Показать строки DatagridView
есть datagridview. Заполняется кодом. ФИО|Адрес|Телефон Отбор по полю адрес. Например вводим в текстовое поле адрес, нажимаем на...

Показать номера символов, совпадающих с последним символом строки
Дана строка. Показать номера символов, совпадающих с последним символом строки

Показать номера символов совпадающих с последним символом строки
Дана строка. Показать номера символов совпадающих с последним символом строки.

13
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
06.09.2021, 03:50
Лучший ответ Сообщение было отмечено Felikss как решение

Решение

26 строка
C#
1
label134.Text += ", " + rowToCompare.Cells["колонка_в_которой_хранится_ID"].Value.ToString();
Между 30 и 31 строками вставьте
C#
1
 label134.Text = label134.Text.Substring(2);
- удаляем начальные ", "
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
06.09.2021, 06:08  [ТС]
sfumatori, Спасибо, все работает
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
07.09.2021, 08:13  [ТС]
sfumatori, Привет!
Появилась проблема. Когда нету дубликатов то возникает ошибка.
Как исправить ошибку?
Миниатюры
Как показать в label ID номера из datagridview те строки которые закрашены  
0
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
07.09.2021, 08:24
Лучший ответ Сообщение было отмечено Felikss как решение

Решение

Последнюю строчку, которую я предложил, замените на

C#
1
label134.Text = label134.Length>2 ? label134.Text.Substring(2) : "";
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
07.09.2021, 10:01  [ТС]
sfumatori, Теперь все в порядке. Большое Вам Спасибо

Добавлено через 1 час 14 минут
sfumatori,
Можно спросить один вопрос про дубликаты!
На форме есть дополнительные 4 кнопки: Первый, Следующий, Предыдущий, Последний.
Каторие в датагрид показывает где находится дубликаты.
На кнопку Первый у меня такой код и все работает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private void button45_Click(object sender, EventArgs e)
{
  for (int currentRow = 0; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
                {
                    DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow];
                    for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count; otherRow++)
                    {
                        DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
                        bool duplicateRow = true;
                        if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
                        {
                            duplicateRow = false;
                        }
                        if (duplicateRow)
                        {
                            advancedDataGridView15.FirstDisplayedScrollingRowIndex = currentRow - 2;
                            advancedDataGridView15.Rows[currentRow].DefaultCellStyle.SelectionBackColor = System.Drawing.Color.Red;
                            advancedDataGridView15.Rows[currentRow].Selected = true;
                            return;
                        }
                    }
                }
            }
На кнопку Последний у меня такой код и все работает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void button46_Click(object sender, EventArgs e)
        {
         for (int currentRow = 0; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
                {
 
                    DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow];
                    for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count; otherRow++)
                    {
                        DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
                        bool duplicateRow = true;
                        if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
                        {
                            duplicateRow = false;
                        }
                        if (duplicateRow)
                        {
                            advancedDataGridView15.FirstDisplayedScrollingRowIndex = currentRow - 2;
                            advancedDataGridView15.Rows[currentRow].DefaultCellStyle.SelectionBackColor = System.Drawing.Color.Red;
                            advancedDataGridView15.Rows[currentRow].Selected = true;
                        }
                    }
                }
            }
Не Знаю что писать для кнопки Следующий и Предыдущий.
0
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
07.09.2021, 11:02
Кнопка "Следующий" должен найти в adgv15 следующую (после текущей) строку, имеющую в этой же таблице дубликаты. Таким образом, сделайте такой же метод, что и button45_Click, только цикл в нем должен начинаться не с 0, а с:
C#
1
for (int currentRow = advancedDataGridView15.CurrentRow.Index+1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
Кстати для этих целей вы можете использовать один метод как для кнопки button45, так и для кнопки, скажем, buttonNext, просто тогда он начинаться будет немного по-другому:
C#
1
2
3
4
5
6
 private void button45_Click(object sender, EventArgs e)
{
 int currentRow = sender == button45 ? 0 : advancedDataGridView15.CurrentRow.Index+1;
  for (; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
     {
...............................
Так удобнее: меньше кода и править ошибки и вносить изменения в алгоритм будет проще.

Насчет предыдущего, в целом тоже подойдет алгоритм из button45_Click, но цикл уже придется организовывать следующим образом:

C#
1
for (int currentRow = advancedDataGridView15.CurrentRow.Index-1; currentRow >0; currentRow--)
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
07.09.2021, 17:53  [ТС]
sfumatori,
Найдены дубликаты ID: 11, 64, 82
Нажав на кнопку Первый - показывает запись с ID 11
Если нажать на кнопку Следующий - Нечего не происходит. Если в коде для кнопке следущий убрать в конце return;, то нажав на кнопку следущий, показивает ID 82 - тоесть последний

Я менял код крест-накрест по-всякому и ничего.

Добавлено через 3 часа 42 минуты
sfumatori,
Добавил еще один дубликат. Теперь ИД 11, 64, 77, 82

Если на кнопку button43 "Следующий" зделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void button43_Click(object sender, EventArgs e)
        {           
                for (int currentRow = + 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
                {
                    DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow++];
                    for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count - 1; otherRow++)
                    {
                        DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
                        bool duplicateRow = true;
                        if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
                        {
                            duplicateRow = false;
                        }
                        if (duplicateRow)
                        {
                            advancedDataGridView15.FirstDisplayedScrollingRowIndex = currentRow - 3;
                            advancedDataGridView15.Rows[currentRow--].DefaultCellStyle.SelectionBackColor = System.Drawing.Color.Red;
                          
                        }
                    }
                }
            }
        }
То при нажатие переходит к следующему дубликату ИД 64, но нажав еще раз то ничего не происходит, а надо переходить к ИД 77.
Мистика какая то...
0
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
08.09.2021, 04:05
Цитата Сообщение от Felikss Посмотреть сообщение
for (int currentRow = + 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
Вы начинаете поиск с 1 строки (т.е. фактически со второй). А вам нужно начинать поиск с "текущей". Переменная currentRow объявляется у вас в цикле и в пределах цикла она и живет.
Я же вам написал, что для поиска "следующего" цикл должен быть таким:
for (int currentRow = advancedDataGridView15.CurrentRow.Index+ 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
08.09.2021, 09:07  [ТС]
sfumatori,
Доброе утро!
Если так, и нажать на кнопку, то ничего не происходит

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private void button43_Click(object sender, EventArgs e)
        {         
                for (int currentRow = advancedDataGridView15.CurrentRow.Index + 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow++)
                {
                    DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow++];
                    for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count - 1; otherRow++)
                    {
                        DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
                        bool duplicateRow = true;
                        if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
                        {
                            duplicateRow = false;
                        }
                        if (duplicateRow)
                        {
                            advancedDataGridView15.FirstDisplayedScrollingRowIndex = currentRow - 2;
                            advancedDataGridView15.Rows[currentRow].DefaultCellStyle.SelectionBackColor = System.Drawing.Color.Red;
                            advancedDataGridView15.Rows[currentRow].Selected = true;
                            
                        }
                    }
                }
            }
0
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
08.09.2021, 10:44
Лучший ответ Сообщение было отмечено Felikss как решение

Решение

3 момента:
1) Первую строку замените на 2 следующие:
C#
1
2
            int i = dataGridView1.SelectedRows.Count > 0 ? dataGridView1.SelectedRows[0].Index : 0;
            for (int currentRow = i + 1; currentRow < dataGridView1.Rows.Count - 1; currentRow++)
Т.е. если уже есть выделенные строки, то поиск начинаем с последней (она идет под индексом 0 в dataGridView1.SelectedRows[0]...)

2) Зачем у вас в 5-й строке еще увеличивается currentRow++? Вы же так в поиске будете через строку скакать

3) Если это код кнопки "Следующий", то верните в 19-ю строку return, а то у вас алгоритм будет пробегаться до конца таблицы и показывать последнее совпадение
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
08.09.2021, 10:56  [ТС]
sfumatori,
Ну Вы просто Мастер в этом деле.
Всё получилось. Ураааа.
Спасибо Вам за потраченное время на мою некомпетентность в программировании.
Тепер буду кнопку Предыдущий мучать
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
08.09.2021, 11:39  [ТС]
sfumatori,

Кнопка Предыдущий работает, но когда доходит до первой ИД 11 и нажать кнопку еще раз, то выскакивает ошибка:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int i = advancedDataGridView15.SelectedRows.Count > 0 ? advancedDataGridView15.SelectedRows[0].Index : 0;
                for (int currentRow = i - 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow--)
 
                {
                    DataGridViewRow rowToCompare = advancedDataGridView15.Rows[currentRow];
                    for (int otherRow = currentRow + 1; otherRow < advancedDataGridView15.Rows.Count - 1; otherRow++)
                    {
                        DataGridViewRow row = advancedDataGridView15.Rows[otherRow];
                        bool duplicateRow = true;
                        if (!rowToCompare.Cells[3].Value.Equals(row.Cells[3].Value) || !rowToCompare.Cells[4].Value.Equals(row.Cells[4].Value) || !rowToCompare.Cells[5].Value.Equals(row.Cells[5].Value) || !rowToCompare.Cells[6].Value.Equals(row.Cells[6].Value) || !rowToCompare.Cells[7].Value.Equals(row.Cells[7].Value))
                        {
                            duplicateRow = false;
                        }
                        if (duplicateRow)
                        {
                            advancedDataGridView15.FirstDisplayedScrollingRowIndex = currentRow - 2;
                            advancedDataGridView15.Rows[currentRow].DefaultCellStyle.SelectionBackColor = System.Drawing.Color.Red;
                            advancedDataGridView15.Rows[currentRow].Selected = true;
                            return;
                        }
                    }
                }
Миниатюры
Как показать в label ID номера из datagridview те строки которые закрашены  
0
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
09.09.2021, 05:34
Как у вас цикл идет?
for (int currentRow = i - 1; currentRow < advancedDataGridView15.Rows.Count - 1; currentRow--)
Т.е. у вас с каждой итерацией currentRow будет уменьшаться, а ограничение цикла, чтобы currentRow < advancedDataGridView15.Rows.Count - 1, так -1, тоже меньше количества строк в гриде, вот у вас и ошибка вываливается.
Если цикл идет на уменьшение, то так:
C#
1
for (int currentRow = i - 1; currentRow >=0; currentRow--)
Затем, первая строка.... Тут лучше так вычислять:
C#
1
int i = advancedDataGridView15.SelectedRows.Count > 0 ? advancedDataGridView15.SelectedRowsOfType<DataGridViewRow>().Select(s => s.Index).Min() : advancedDataGridView15.Rows.Count - 1 ;
Раз пользователь может гулять по этим дубликатам как ему вздумается вперед и назад.
То, наверное, удобнее было бы в классе определить какую-нибудь переменную int curDubl (текущий дубликат), и поиск продолжать не с вычисляемой i, а с этой переменной
В кнопке "Первое" curDubl инициализируется в 0, в "Последнее" - в advancedDataGridView15.Rows.Count - 1.
В кнопках "Следующее" и "Предыдущее" curDubl берется как есть, но цикл начинается с int currentRow = i + 1 / int currentRow = i - 1 соответственно.
Но во всех 4-х кнопках как только вы нашли очередной дубликат, сохраняете индекс этой строки в curDubl.
Смотрите, это мое мнение, у вас запросто может быть другое видение на задачу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2021, 05:34
Помогаю со студенческими работами здесь

Дана строка. Показать номера символов, совпадающих с последним символом строки
Дана строка. Показать номера символов, совпадающих с последним символом строки.

Вывод текста из строки(ячейки) DataGridView в Label
Добрый день! Проблемка заключается в том, что мне нужно вывести текста из ячейки датагрид в лейбл...Данные в датагрид подгружаются из БД...

Как удалить в следующих ComboBox (колонки DataGridView) строки (пункты), которые были выбраны в предыдущих?
У меня есть dataGridView1. Тип одной из колонок - ComboBox. Есть данные из БД, которыми заполняются combobox-ы в этом столбце. Как мне...

Получение номера строки в dataGridView
Привет! Подскажите пожалуйста как получить номер строки по которой 2 раза кликнул? Попробовал так: private void...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru