Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
1
.NET 4.x

Сравнить две datagridview (два столбца), выделить несовпадения

20.11.2019, 13:17. Показов 2201. Ответов 18

Author24 — интернет-сервис помощи студентам
Всем привет, помогите, пожалуйста с кодом.
Мне нужно сравнить две таблицы. Обе datagrid заполняются из двух разных database.

1. таблица - сюда падают значения из таблицы, в которую попадаю значения вводимые в текст бокс. database - manualdt
ArtQty
12312312123
78945612125
14725836127
96385241129
97592003131

2. таблица - сюда попадают значения из базы данных, которые фильтруются по ранее созданной кнопке. database - selected truck
ArtNameQty
12312312qwe12
78945612wer125
14725836ert127
96385241rty129
97592003tyu111

Требуется сравнить столбец qty, основываясь на совпадениях в столбце art.
Подскажите как это сделать. Не могу найти нигде решений(
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2019, 13:17
Ответы с готовыми решениями:

Разбить один столбец DataGridView на два столбца по символу - разделителю @
Всем привет! Есть один столбец в datagridview. Содержимое столбца: Фамилия Имя Иванов @ Вадим...

Сравнить два столбца с разных листов и вывести несовпадения на отдельный лист
Добрый день, уважаемые ГУРУ VBA! Задача заключается в следующем, есть книга с двумя листами Лист...

Как сравнить два столбца и выделить строки, в которых данные не совпадают
Добрый день как сравнить два столбца с датами и выделить строки в которых дата не совпадает ...

Сравнить два текста, разницу выделить
Здравствуйте, надо сравнить 2 текста, 1-й исходный, 2-й немного измененный, удаленные фрагметы с...

18
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
20.11.2019, 14:07 2
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Dim gr1, gr2 As DataGridViewRow
Dim result As New List(Of DataGridViewRow)
 
For each gr1 in DataGridView1.Rows
    For each gr2 in DataGridView2.Rows 
        If gr2("Qty") = gr1("Qty") Then
            If Not result.Contains(gr2) Then
                result.Add(gr2)
            End if
        End if
    Next gr2
Next gr1
в result будут строки с совпадающими значениями Qty.
1
Модератор
Эксперт .NET
4320 / 3394 / 507
Регистрация: 27.01.2014
Сообщений: 6,192
20.11.2019, 14:22 3
а потом что, после сравнения? Изложите полностью задачу, чтобы подобрать оптимальный вариант, т.к. по мне, лучще формировать массив Индерксов строк вместо самих строк, чтобы иметь возможность далее вносить в строки изменения.
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
20.11.2019, 14:25  [ТС] 4
Как то не помогло( выдает ошибку

Добавлено через 2 минуты
мне трребуется сравнить данные двух таблиц. то что есть в системе, и то что внесено по документам. И выявить несоответсвие системных данных и документации. то что вноситься - вносится через textbox в базу данных, которая является datasource для gridview.
0
Модератор
Эксперт .NET
4320 / 3394 / 507
Регистрация: 27.01.2014
Сообщений: 6,192
20.11.2019, 14:26 5
Aleksandr Belyy, это я понятно. А что потом? После получения данных о разногласии значении? Редактировать или просто показать на экране эту разницу по каждой строке?
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
20.11.2019, 14:34  [ТС] 6
мне нужно их просто выделить в обеих таблицах
0
Модератор
Эксперт .NET
4320 / 3394 / 507
Регистрация: 27.01.2014
Сообщений: 6,192
20.11.2019, 15:24 7
Aleksandr Belyy, ну тогда сразу это и делайте, не создавая отдельный массив строк.
0
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
20.11.2019, 15:47 8
VB.NET
1
2
3
4
5
6
7
8
9
10
Dim gr1, gr2 As DataGridViewRow
 
For each gr1 in DataGridView1.Rows
    For each gr2 in DataGridView2.Rows 
        If gr2("Qty") = gr1("Qty") Then
            gr1.DefaultCellStyle.BackColor = Color.Aquamarine
            gr2.DefaultCellStyle.BackColor = Color.Aquamarine
        End if
    Next gr2
Next gr1
строки с совпадающими значениями Qty будут выделены.

Добавлено через 4 минуты
можно пойти по другому, сначала все строки обоих гридов закрасить, а затем для совпадающих по Qty цвет фона сделать тем, который установлен по умолчанию. Тогда выделенными останутся только те, которые отличаются по Qty.
1
263 / 215 / 53
Регистрация: 01.08.2016
Сообщений: 828
20.11.2019, 15:52 9
Uswer, А почему идет подчеркивание перменных gr1и gr2 и пишет что Класс DataGridViewRow не может быть индексирован, так как не имеет свойства по умолчанию
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
20.11.2019, 15:56  [ТС] 10
USWER, к сожалению такой вариант получается не совсем корректный. т к количества бывают похожи. а мне требуется сравнить две ячейки нераздельно на совпадение.
то есть где арт одинаковый - там и qty должно совпадать.
0
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
20.11.2019, 16:02 11
andrsh, попробуй применить оператор Option Strict Off

Aleksandr Belyy, так что ли?
VB.NET
1
2
3
4
5
6
7
8
9
10
Dim gr1, gr2 As DataGridViewRow
 
For each gr1 in DataGridView1.Rows
    For each gr2 in DataGridView2.Rows 
        If gr1("Art") = gr2("Art") AndAlso gr2("Qty") = gr1("Qty") Then
            gr1.DefaultCellStyle.BackColor = Color.Aquamarine
            gr2.DefaultCellStyle.BackColor = Color.Aquamarine
        End if
    Next gr2
Next gr1
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
20.11.2019, 16:47  [ТС] 12
Uswer, не выходит(
Выдает ошибку: An unhandled exception of type 'System.NullReferenceException' occurred in Check deliveries.exe

Additional information: Object reference not set to an instance of an object.
0
263 / 215 / 53
Регистрация: 01.08.2016
Сообщений: 828
20.11.2019, 17:26 13
Aleksandr Belyy, Вот так работает все:
VB.NET
1
2
3
4
5
6
7
8
9
10
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For ia As Integer = 0 To DGV1.Rows.Count - 1
            For ib As Integer = 0 To DGV2.Rows.Count - 1
                If DGV1.Rows(ia).Cells(1).Value = DGV2.Rows(ib).Cells(2).Value Then
                    DGV1.Rows(ia).DefaultCellStyle.BackColor = Color.Aquamarine
                    DGV2.Rows(ib).DefaultCellStyle.BackColor = Color.Aquamarine
                End If
            Next
        Next
    End Sub
0
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
20.11.2019, 18:18 14
Лучший ответ Сообщение было отмечено Aleksandr Belyy как решение

Решение

Aleksandr Belyy, andrsh, признаю ошибку. Проверил в среде, вот как будет работать:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Dim gr1, gr2 As DataGridViewRow
 
For each gr1 in DataGridView1.Rows
    For each gr2 in DataGridView2.Rows 
        If CLng(gr1.Cells("Art").Value) = CLng(gr2.Cells("Art").Value) AndAlso _
           CLng(gr1.Cells("Qty").Value) = CLng(gr2.Cells("Qty").Value) Then
            gr1.DefaultCellStyle.BackColor = Color.Aquamarine
            gr2.DefaultCellStyle.BackColor = Color.Aquamarine
        End if
    Next gr2
Next gr1
1
263 / 215 / 53
Регистрация: 01.08.2016
Сообщений: 828
20.11.2019, 18:50 15
Uswer, Подскажи, почему у меня твой пример опять не работает? Ошибка : " Не удается найти столбец с именем Art". Хотя названия столбцов совпадают. Это уже не только в этом случае. Типа таких вопросов были еще на форуме и результат такой же. По индексам столбцов все нормально получается.

Добавлено через 10 минут
Все, понял почему так происходит. Так как колонны добавляются в ДГВ вручную, при создании дгв то надо было добавить такой код:
VB.NET
1
2
3
4
Column1.Name = "Art"
        Column2.Name = "Qty"
        Column3.Name = "Art"
        Column5.Name = "Qty"
Если бы данные заносились в дгв из дататабле или из бд то присваивать имена колоннам не надо.
0
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
20.11.2019, 20:32 16
andrsh, я не приветствую обращение к элементам DataGridView и другим элементам управления используя жёсткую привязку к индексам. Это связано в первую очередь с тем, что структура данных может поменяться и все привязки по индексам придётся исправлять, как минимум проверять. Этого недостатка лишена именованная привязка. Это чисто мой взгляд на написание кода, твой вариант также работоспособен, с маленькой оговоркой о типах сравниваемых данных в IF.
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
21.11.2019, 18:20  [ТС] 17
к сожалению опять выдает ошибку... Я думаю, что это изза пустой строки в датагридвью , куда текст через текстбокс падает. Что можно прописать, чтоб он не считывал строку, в которой нет данных?

*****
An unhandled exception of type 'System.NullReferenceException' occurred in Check deliveries.exe

Additional information: Object reference not set to an instance of an object.

Добавлено через 1 час 3 минуты
Uswer, спасибо. Я чуть доработал твой вчерашний код - сделал проверку на значения в строке) помогло)

а есть мысль, как отсортировать по цвету эти таблицы, после подкрашивания?
0
2107 / 1517 / 392
Регистрация: 26.06.2017
Сообщений: 4,355
21.11.2019, 18:31 18
Цитата Сообщение от Aleksandr Belyy Посмотреть сообщение
Что можно прописать, чтоб он не считывал строку, в которой нет данных?
Добавить проверку на присутствие данных пример см. здесь.
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
21.11.2019, 18:43  [ТС] 19
Цитата Сообщение от Uswer Посмотреть сообщение
Добавить проверку на присутствие данных пример см. здесь.
Да, я уже нашел решение, осталось сортировку наладить) Спасибо
0
21.11.2019, 18:43
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2019, 18:43
Помогаю со студенческими работами здесь

Сравнить построчно два столбца
Добрый день, есть два столбца A и B с текстовыми данными, нужно их сравнить, найти значение в...

Сравнить два столбца таблиц
Здравствуйте! Есть две таблицы: Отделы и Работники. Во второй таблице есть столбец отделы для...

Сравнить два диапазона, и выделить цветом отсутствующие позиции в противоположных списках
Всем, Доброго времени суток! Имеется замечательный макрос (Благодарю автора Hugo), который...

Сравнить два столбца в двух книгах
Есть один столбец в котором 23000 строк в книге №1, и есть столбец с 1600 стоками в книге №2....


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru