Форум программистов, компьютерный форум, киберфорум
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. Показов 2182. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2019, 13:17
Ответы с готовыми решениями:

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

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

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

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

18
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,181
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
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,181
20.11.2019, 14:26 5
Aleksandr Belyy, это я понятно. А что потом? После получения данных о разногласии значении? Редактировать или просто показать на экране эту разницу по каждой строке?
0
0 / 0 / 0
Регистрация: 20.11.2019
Сообщений: 7
20.11.2019, 14:34  [ТС] 6
мне нужно их просто выделить в обеих таблицах
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,181
20.11.2019, 15:24 7
Aleksandr Belyy, ну тогда сразу это и делайте, не создавая отдельный массив строк.
0
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
258 / 211 / 52
Регистрация: 01.08.2016
Сообщений: 822
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
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
258 / 211 / 52
Регистрация: 01.08.2016
Сообщений: 822
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
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
258 / 211 / 52
Регистрация: 01.08.2016
Сообщений: 822
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
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
2089 / 1501 / 389
Регистрация: 26.06.2017
Сообщений: 4,293
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2019, 18:43
Помогаю со студенческими работами здесь

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

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

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

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


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

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