Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
1

Сравнение данных двух DataGridView

20.01.2021, 11:22. Просмотров 3473. Ответов 26
Метки нет (Все метки)

Доброго всем дня!
Подскажите, пожалуйста, как реализовать следующее:
Скажем, есть 2 сетки datagridview со следующими данными:
Первый Datagridview:
Уникальный кодФамилияИмяОтчество
110923ПетроваЕкатеринаСергеевна
118271СоколовПетрАлексеевич
432099АлексееваКаринаИгоревна
328764ВасильевАлексейАлександрович
783021ПетровЕвгенийДмитриевич
873243ЛитвиновСергейСергеевич
342153КруговойВасилийАлександрович

Второй Datagridview:
Уникальный кодФамилияИмяОтчество
432099АлексееваКаринаИгоревна
873243ЛитвиновСергейСергеевич
342153КруговойВасилийАлександрович
110923ПетроваЕкатеринаСергеевна

При клике на кнопку необходимо сравнить эти 2 списка по столбцу "Уникальный код" (расположение столбца может иметь разный индекс) и вывести в DatagridView3 данные которые совпали по спискам и в DataGridview 4 данные, которые не совпали.
Количество записей по сеткам DGV1 и DGV2 может быть разное. (не всегда записей в DGV1 будет больше чем в DGV2)
По данному примеру результат будет такой:

DGV3: (данные которые совпали:
Уникальный кодФамилияИмяОтчество
432099АлексееваКаринаИгоревна
873243ЛитвиновСергейСергеевич
342153КруговойВасилийАлександрович
110923ПетроваЕкатеринаСергеевна

и в DGV4 (Данные, которые не совпали)
Уникальный кодФамилияИмяОтчество
118271СоколовПетрАлексеевич
328764ВасильевАлексейАлександрович
783021ПетровЕвгенийДмитриевич

Подскажите, как это можно реализовать? Заранее спасибо Вам за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2021, 11:22
Ответы с готовыми решениями:

Сравнение данных из ячеек DataGridView на двух разных формах
Есть 2 формы, на одной есть DataGridView и на второй - DataGridView. Нужно сравнить данные из...

Сравнение двух DataGridView
Всем привет! Сравнивая 2 DataGridView между собой, как правильно организовать код, чтобы...

Сравнение данных в двух DataGridView с помощью циклов
Есть два грида, оба заполняются из бд. В одном можно изменять значения и добавлять новые строки....

Сравнение адресов в двух DataGridView
Ув.форумчане. В форме есть 2 датагрид. Загружает данные с SQL.

26
Лень — мое второе и
2940 / 2173 / 634
Регистрация: 28.11.2014
Сообщений: 3,305
Записей в блоге: 2
20.01.2021, 13:35 2
KwaZZi, у Вас куча вопросов по работе с Datagridview, в которых делалось что-то похожее, что конкретно у Вас не получается?
0
3551 / 2881 / 699
Регистрация: 02.02.2013
Сообщений: 2,764
Записей в блоге: 2
20.01.2021, 14:02 3
Цитата Сообщение от KwaZZi Посмотреть сообщение
Скажем, есть 2 сетки datagridview со следующими данными:
Первый возникающий вопрос, что является источником данных?
0
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
20.01.2021, 14:34  [ТС] 4
ovva, из файлов list1.csv и list2.csv загружаются списки в сетки datagridview.

Добавлено через 16 минут
ovva, Вот так загружаю данные с двух файлов в 2 сетки DGV:

vb.net
1
2
DataGridView1.DataSource = NewDataTable("D:\list1.csv", "|", True)
DataGridView2.DataSource = NewDataTable("D:\list2.csv", "|", True)
vb.net
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
 Public Shared Function NewDataTable(ByVal fileName As String, ByVal delimiters As String, Optional ByVal firstRowContainsFieldNames As Boolean = True) As DataTable
        Dim result As New DataTable()
 
        Using tfp As New TextFieldParser(fileName)
            tfp.SetDelimiters(delimiters)
 
            If Not tfp.EndOfData Then
                Dim fields() As String = tfp.ReadFields()
 
                For i As Integer = 0 To fields.Count() - 1
                    If firstRowContainsFieldNames Then
                        result.Columns.Add(fields(i))
                    Else
                        result.Columns.Add("Col" & i)
                    End If
                Next i
 
                If Not firstRowContainsFieldNames Then
                    result.Rows.Add(fields)
                End If
            End If
 
            Do While Not tfp.EndOfData
                result.Rows.Add(tfp.ReadFields())
            Loop
        End Using
        Return result
    End Function
0
3551 / 2881 / 699
Регистрация: 02.02.2013
Сообщений: 2,764
Записей в блоге: 2
20.01.2021, 14:46 5
Сравнивать нужно непосредственно данные, например
vb.net
1
2
3
4
Dim f1() As String = File.ReadAllLines("list1.csv")
Dim f2() As String = File.ReadAllLines("list2.csv")
Dim f4 As IEnumerable(Of String) = f1.Except(f2)
Dim f3 As IEnumerable(Of String) = f1.Intersect(f2)
И далее f3 и f4 загружаете в соответствующие сетки.
Здесь сравниваются строки целиком, но несложно пример расширить на сравнение только по первому полю.
2
3551 / 2881 / 699
Регистрация: 02.02.2013
Сообщений: 2,764
Записей в блоге: 2
20.01.2021, 14:51 6
Исходные данные
0
Вложения
Тип файла: rar Debug.rar (507 байт, 7 просмотров)
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
20.01.2021, 15:08  [ТС] 7
ovva, Подскажите, что то я не понимаю, как это все использовать. Можно расширенный пример?
0
Модератор
Эксперт .NET
3241 / 2902 / 448
Регистрация: 27.01.2014
Сообщений: 5,392
20.01.2021, 15:21 8
можно и обычным перебором в цикле, чтобы было более понятно начинающим.
0
3551 / 2881 / 699
Регистрация: 02.02.2013
Сообщений: 2,764
Записей в блоге: 2
20.01.2021, 16:28 9
Лучший ответ Сообщение было отмечено KwaZZi как решение

Решение

Файлы данных:
Цитата Сообщение от KwaZZi Посмотреть сообщение
Можно расширенный пример?
Например
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
    Dim f1() As String = File.ReadAllLines("list1.csv")
    Dim f2() As String = File.ReadAllLines("list2.csv")
    Dim f4 As IEnumerable(Of String) = f1.Except(f2)
    Dim f3 As IEnumerable(Of String) = f1.Intersect(f2)
    toGrid(f1.AsEnumerable, ",", DataGridView1)
    'аналогично f2, f3, f4
End Sub
Private Sub toGrid(ByVal ff As IEnumerable(Of String), ByVal delim As String, ByRef dgv As DataGridView)
    dgv.Columns.Clear()
    dgv.ColumnCount = 4
    For Each ss As String In ff
        Dim s() As String = ss.Split(delim)
        dgv.Rows.Add(s)
    Next
End Sub
1
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
20.01.2021, 17:21  [ТС] 10
ovva, Это по всей строке, как я понимаю. Работает отлично. Спасибо большое) Подскажите, пожалуйста, как сделать сравнение только по тому столбцу, который я задам (в данном примере - это столбец с индексом 0). А если столбцов будет больше, можно как то сделать что бы не указывать их жестко в коде?

Добавлено через 10 минут
ovva, можно ли еще как то добавить первую строчку с файла csv в заголовок?

Добавлено через 32 минуты
Yury Komar,
Цитата Сообщение от Yury Komar Посмотреть сообщение
можно и обычным перебором в цикле, чтобы было более понятно начинающим.
Не подскажите как?
0
3551 / 2881 / 699
Регистрация: 02.02.2013
Сообщений: 2,764
Записей в блоге: 2
20.01.2021, 18:04 11
Лучший ответ Сообщение было отмечено KwaZZi как решение

Решение

Цитата Сообщение от KwaZZi Посмотреть сообщение
как сделать сравнение только по тому столбцу, который я задам (в данном примере - это столбец с индексом 0)
vb.net
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
Public Class Form1
'…
    Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
        Dim f1() As String = File.ReadAllLines("list1.csv")
        Dim f2() As String = File.ReadAllLines("list2.csv")
        Dim cmp As New myDataComparer(0)
        Dim f4 As IEnumerable(Of String) = f1.Except(f2, cmp)
        Dim f3 As IEnumerable(Of String) = f1.Intersect(f2, cmp)
        toGrid(f1.AsEnumerable, ",", DataGridView1)
        'аналогично f2, f3, f4
    End Sub
End Class
 
Class myDataComparer
    Implements IEqualityComparer(Of String)
    Private col As Integer
    Public Sub New()
        col = 0
    End Sub
    Public Sub New(ByVal column As Integer)
        col = column
    End Sub
    Public Property delim As String = ","
    Public Overloads Function Equals(ByVal x As String, ByVal y As String) _
                  As Boolean Implements IEqualityComparer(Of String).Equals
        Dim sx As String = x.Split(delim)(0)
        Dim sy As String = y.Split(delim)(0)
        If sx Is Nothing AndAlso sy Is Nothing Then
            Return True
        ElseIf sx Is Nothing Or sy Is Nothing Then
            Return False
        ElseIf sx.Equals(sy) Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Overloads Function GetHashCode(ByVal xx As String) _
                As Integer Implements IEqualityComparer(Of String).GetHashCode
        Return xx.GetHashCode()
    End Function
End Class
Цитата Сообщение от KwaZZi Посмотреть сообщение
А если столбцов будет больше, можно как то сделать что бы не указывать их жестко в коде?
не понял
С заголовком полагаю, что вам по силам и самому разобраться.

Добавлено через 27 минут
Измените в функции Equals
vb.net
1
2
Dim sx As String = x.Split(delim)(col)
Dim sy As String = y.Split(delim)(col)
чтобы можно было сравнивать по выбранному полю (это подразумевалось, но как-то выпало)
1
209 / 187 / 36
Регистрация: 04.02.2015
Сообщений: 1,191
20.01.2021, 18:35 12
Я бы все скинул во временную таблицу и там был сверил sql запросом
1
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
21.01.2021, 09:28  [ТС] 13
ovva,
подскажите, пожалуйста нашел еще вот такой еще код по сравнению 2х файлов csv, но не могу понять, как вывести результат в 2 файла(совпадения и не совпадения)

vb.net
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
       Dim lines As New List(Of String)()
    Dim lines2 As New List(Of String)()
 
 
 
    Try
        Dim reader As New StreamReader(System.IO.File.OpenRead("List1.csv"))
        Dim read As New StreamReader(System.IO.File.OpenRead("List2.csv"))
 
        Dim line As String
        Dim line2 As String
 
        'With this you can change the cells you want to compair
        Dim comp1 As Integer = 1
        Dim comp2 As Integer = 1
 
        line2 = read.ReadLine()
        line = reader.ReadLine()
 
        Do While line IsNot Nothing AndAlso line2 IsNot Nothing
            Dim split() As String = line.Split(Convert.ToChar(";"))
            Dim split2() As String = line2.Split(Convert.ToChar(";"))
 
            If line.Contains(";") AndAlso line2.Contains(";") Then
                If split(comp1) <> split2(comp2) Then
                    'It is not the same
                Else
                    'It is the same
 
                End If
            End If
            line2 = read.ReadLine()
            line = reader.ReadLine()
        Loop
        reader.Dispose()
        read.Dispose()
    Catch
 
    End Try
Как понимаю что вот в этом If'е:
vb.net
1
2
3
4
5
6
If split(comp1) <> split2(comp2) Then
                    'It is not the same
                Else
                    'It is the same
 
                End If
Подскажите как записать результат в 2 файла, в совпадения и не совпадения.
Заранее спасибо.
0
Модератор
Эксперт .NET
3241 / 2902 / 448
Регистрация: 27.01.2014
Сообщений: 5,392
21.01.2021, 10:03 14
UBUNTU, зачем, когда есть способы средствами самого ЯП это сделать?
0
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
21.01.2021, 10:31  [ТС] 15
Orlangur, Yury Komar, Пытаюсь сделать так же - обычным перебором, получается пока вот что:

vb.net
1
2
3
4
5
6
7
8
9
10
  For Each rw1 As DataGridViewRow In DataGridView1.Rows
            For Each rw2 As DataGridViewRow In DataGridView2.Rows
                If rw1.Cells(4).Value = rw2.Cells(4).Value Then
                    If rw1.Cells(4).Value IsNot Nothing Then
                        MsgBox(rw1.Cells(4).Value & "  найден в сетеке dgv2")
                        Exit For
                    End If
                End If
            Next
        Next
Подскажите, как скопировать теперь то что совпало в dgv3, а то что не совпало в dgv4?
0
209 / 187 / 36
Регистрация: 04.02.2015
Сообщений: 1,191
21.01.2021, 10:38 16
Цитата Сообщение от Yury Komar Посмотреть сообщение
зачем, когда есть способы средствами самого ЯП это сделать?
Зачем нагружать комп пользователя, когда есть мощность сервера? где явно больше чисел. недавно проект дописал один, ни 1 задачи не лежит на стороне клиента кроме простой авторизации, все остальное лежит на сервере, ни 1 цикла и прочего на стороне клиента.
0
606 / 484 / 119
Регистрация: 26.06.2017
Сообщений: 1,325
21.01.2021, 12:00 17
UBUNTU, ну и зачем так делать? Мощность сервера не безгранична и его нагрузка всякой ерундой может привести к отказу в обслуживании других клиентов сети.
1
Модератор
Эксперт .NET
3241 / 2902 / 448
Регистрация: 27.01.2014
Сообщений: 5,392
21.01.2021, 13:01 18
UBUNTU, Я считаю, что, конкретно данную задачу не стоит решать так, как вы предложили. Ведь это сколько лишний действий, таких как: Подключение к базе, создание таблицы(нескольких таблиц), запись ВСЕХ данных в базу, а если их тысячи или десятки тысяч? Затем выборка, данных, и т.п., а если соединение оборвется (если база удалена от пользователя и не на локальном ПК), выигрыша в скорости точно не будет, а мороки больше. Когда как такие задачи легко решаются в операттвной памяти, что гораздо быстрее, чем БД на харде, к тому же, язык программирования имеет в своём арсенале методы/функции/классы, решаюшие такие задачи быстро и легко, без лишнего гемора.

Взгляните на пример OVVA, все просто и наглядно, каждый шаг можно отследить, скорректировать, дополнить и т.п. А если кросс-платформа? То ваш случай будет еще куда более сложным в реализации. ИМХО.
0
1333 / 1270 / 295
Регистрация: 03.10.2012
Сообщений: 1,329
21.01.2021, 16:20 19
Цитата Сообщение от KwaZZi Посмотреть сообщение
как записать результат в 2 файла, в совпадения и не совпадения
vb.net
1
2
3
4
5
If split(comp1) <> split2(comp2) Then
   IO.File.AppendAllText("путь1", line & vbCrLf) 'несовпадения
Else
   IO.File.AppendAllText("путь2", line & vbCrLf) 'совпадения
End If
1
3 / 3 / 0
Регистрация: 17.01.2020
Сообщений: 161
21.01.2021, 16:22  [ТС] 20
MrCrown, спасибо, сейчас попробую.
может вы еще подскажите, как сделать обычным перебором в dgv?

vb.net
1
2
3
4
5
6
7
8
9
10
For Each rw1 As DataGridViewRow In DataGridView1.Rows
            For Each rw2 As DataGridViewRow In DataGridView2.Rows
                If rw1.Cells(4).Value = rw2.Cells(4).Value Then
                    If rw1.Cells(4).Value IsNot Nothing Then
                        MsgBox(rw1.Cells(4).Value & "  найден в сетке dgv2")
                        Exit For
                    End If
                End If
            Next
        Next
только что бы результат заносился в dgv3 - совпадения в dgv4 - несовпадения
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2021, 16:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сравнение значений в двух таблицах DataGridView
Добрый день. На форме имеются два элемента dataGridView. В один dataGridView данные записываются...

Сравнение данных в разных таблицах DataGridView
Доброго времени суток. Подскажите пожалуйста как можно реализовать сравнение данных в 2-х...

Сравнение данных в двух таблицах БД
Есть две таблицы в одной базе данных, как сравнить значения столбцов и если они совпадут вывести...

Сравнение двух баз данных
Здравствуйте. Подскажите пожалуйста. Есть 2 базы данных, в одной базе данных есть десять человек у...

Перебор данных из БД и их сравнение в двух таблицах
Требуется помощь в написании сравнения колонок 2х таблиц, есть таблица Users там записаны все...

Сравнение данных в двух DataGrid и подсветка изменений
Доброго времени суток, помогите решить такой вопрос: На форме расположены 2 DataGridView, в них...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.