.NET 4.x DataGridView1 like DataGridView2 - Visual Basic .NET

  1. Доброе время суток. Подскажите пожалуйста, как использовать условие отображения информация в DataGridView1 если в DataGridView2 имееются похожие записи?vb.net1 2 3 4 5 6 7         For i = 0 To DataGridView1.Rows.Count - 1             For ii = 0 To DataGridView2.Rows.Count - 1                 If DataGridView1.Rows(i).Cells(0).Value.ToString Like DataGridView2.Rows(ii).Cells(0).Value.ToString Then                     DataGridView1.Rows(i).Cells(0).Value = "ADMIN"                 End If             Next         Next


textual

Код к задаче: «.NET 4.x DataGridView1 like DataGridView2 - Visual Basic .NET»

Public Class Form4
    Private DT As DataTable
    Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        DT = createTable()
        DataGridView1.ColumnCount = 2
        DataGridView1.RowCount = DT.Rows.Count
        For i = 0 To DataGridView1.RowCount - 1
            DataGridView1.Rows(i).Cells(0).Value = DT.Rows(i).Item(0)
            DataGridView1.Rows(i).Cells(1).Value = DT.Rows(i).Item(1)
        Next
        DataGridView2.ColumnCount = 1
        DataGridView2.RowCount = 20
        Dim rnd As New Random
        For i = 0 To DataGridView2.RowCount - 1
            DataGridView2.Rows(i).Cells(0).Value = rnd.Next(1, 200)
        Next
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim vv As Integer
        For i = 0 To DataGridView2.RowCount - 1
            vv = DataGridView2.Rows(i).Cells(0).Value
            For j = 0 To DataGridView1.RowCount - 1
                If DataGridView1.Rows(j).Cells(0).Value = vv.ToString Then
                    DataGridView1.Rows(j).Cells(0).Value = "AD"
                    DataGridView1.Rows(j).Cells(0).Style.ForeColor = Color.Red
                End If
            Next
        Next
    End Sub
    Private Function createTable() As DataTable
        Dim tb As New DataTable
        tb.Columns.Add("ID", System.Type.GetType("System.Int32"))
        tb.Columns.Add("tstValue", System.Type.GetType("System.Int32"))
        tb.PrimaryKey = {tb.Columns(0)}
        Dim rr As DataRow
        Dim rnd As New Random
        For i = 1 To 50
            rr = tb.NewRow
            rr.Item(0) = i
            rr.Item(1) = rnd.Next(10, 90)
            tb.Rows.Add(rr)
        Next
        Return tb
    End Function
End Class

СДЕЛАЙТЕ РЕПОСТ

10   голосов, оценка 4.200 из 5



Похожие ответы
  1. Недавно начал изучать SQLite и наткнулся на проблему - lower() , upper() и LIKE в SQLite не работают с кириллицей. Как решить ту проблему?

  1. Есть 2 таблицы DataGridView. структура первой таблицы: №п/п, ФИО, код должности. (гружу эти данные из файла xml в DataGrid)сам файл очень большой, и экселем не открывается, поэтому при выводе данных из DataGrid в Эксель делаю разбивку по коду должности.vb.net1 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 63 64 65   Const sPath As String = "C:\TMP\razbivka.xlsx"                 Dim sArr(2, 0) As String                 Dim i As Integer, j As Integer, k As Integer, iCount As Integer                 Dim iNum As Integer                 Dim sTmpArr(Me.DataGridView1.Rows.Count - 2) As Integer                   Dim oExcel As Object 'MSExcel                 Dim oBook As Object 'Книга MSExcel                 Dim oSheet As Object 'Лист книга MSExcel                     oExcel = CreateObject("Excel.Application")                 oBook = oExcel.Workbooks.Add                 oExcel.Visible = True                     For i = 0 To UBound(sTmpArr) 'собираем все значения (№) в одномерный массив                     sTmpArr(i) = Me.DataGridView1.Item(2, i).Value                 Next i                   Array.Sort(sTmpArr) 'сортируем массив                   For i = 0 To UBound(sTmpArr)                     ReDim sArr(2, 0)                     iCount = 0                     If iNum <> sTmpArr(i) Then                         iNum = sTmpArr(i)                         Try 'если пустого листа нет, создаем его                             oSheet = oBook.Worksheets(iNum)                         Catch ex As Exception                             oSheet = oBook.Worksheets.Add                         End Try                         oSheet.Cells.NumberFormat = "@"                         For j = 0 To Me.DataGridView1.Rows.Count - 2 'цикл по строкам                             If iNum = Me.DataGridView1.Item(2, j).Value Then                                 ReDim Preserve sArr(2, iCount)                                 For k = 0 To 2 'цикл по столбцам                                     sArr(k, iCount) = Me.DataGridView1.Item(k, j).Value.ToString 'сбор данных в двумерный массив результатов                                 Next k                                 iCount += 1                             End If                         Next j                         oSheet.Range("A1").Resize(iCount, 3).Value = oExcel.Transpose(sArr) 'транспонирование массива                         oSheet.Name = iNum.ToString 'изменения имени листа                     Else                         Continue For                     End If                 Next i                   If IO.File.Exists(sPath) Then 'проверяем существет ли уже файл, если да, то пытаемся его удалить                     Try                         IO.File.Delete(sPath)                     Catch ex As Exception                         MsgBox("Невозможно удалить файл " & sPath & ", ошибка: " & ex.Message, MsgBoxStyle.Critical, "Ошибка")                     End Try                 End If                   Try 'пытаемся сохранить файл                     oBook.SaveAs(sPath)                 Catch ex As Exception                     MsgBox("Невозможно сохранить файл " & sPath & ", ошибка: " & ex.Message, MsgBoxStyle.Critical, "Ошибка")                 End Try                 oSheet = Nothing                 oBook = Nothing                 oExcel = Nothingданный код выводит в эксель и разбивает на листы, именуя их по коду должности. структура второй таблицы: код должности, наименование должности. а теперь вся суть вопроса: как мне переделать код/или дописать его так что бы в имя листа выводить код должности из одной dataGrid и наименование должности из второй DataGrid по формату: код должности_наименование должности. Заранее спасибо за помощь!!!

  1. Всем привет! На Форме есть 2 DataGridView, в DataGridView1 ежеминутно будут обновляться данные, необходимо, скопировать их и просто вставить в DataGridView2.vb.net1 2 DataGridView1.SelectAll()         Clipboard.SetDataObject(DataGridView1.GetClipboardContent())Вот он копирует данные,а вот как их вставить не знаю, заранее спасибо!

  1. В проекте используется библиотека MySQL Connector.NET при обработке запроса вида T-SQL1 SELECT * FROM tablename WHERE columnname LIKE %любой текст на кириллице%Возникает ошибка Illegal mix of collations for operation 'like'. Если же для поиска задать запрос на латинице то все проходит нормально. Код строки подключения: Кликните здесь для просмотра всего текста vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Public Function BuildConnectionString() As String         Dim Builder As New MySqlConnectionStringBuilder         With Builder             .ConnectionProtocol = MySqlConnectionProtocol.Tcp             .Database = "somebdname"             .Password = "anypassword"             .UserID = "username"             .Server = "servername"                       .SqlServerMode = True             .Port = 3306                     .Keepalive = 10             .ConnectionTimeout = 5             .AllowBatch = True             .SslMode = MySqlSslMode.Preferred             .Logging = True             .Pooling = False             .CharacterSet = "cp1251"             .TreatBlobsAsUTF8 = True         End With         Return Builder.ConnectionString     End Function

  1. Всем привет. Столкнулся с проблемой выгрузки данных из DataGridView1 в Excel Почти все примеры, которые есть в Интернете показывают 1 метод - циклом For Next по ячейкам Excel. vb.net1 2 3 4 5 For i = 0 To DataGridView1.RowCount - 2             For j = 0 To DataGridView1.ColumnCount - 1                xlSht.Cells(i + 2, j + 1) = DataGridView1(j, i).Value.ToString()             Next NextДанный метод крайне медленный. По практике работы с Excel могу сказать, что самый быстрый способ взять с листа и записать на лист является способ через использование массива. Взять информацию с листа:vb.net1 myArray() = Range("A1:D100").Valueвернуть данные на лист:vb.net1 Range("A1").Resize(Ubound(myArray,1), Ubound(myArray,2)).Value = myArray()а не такvb.net1 2 3 For i=1 to 100  Cells(i,1) = myArray(i,1) Next iОтсюда вопрос - как можно "взять" данные из DataGridView1 в массив или DataSet (DataTable) Обращение циклом к ячейкам листа Excel - очень медленный процесс, но можно было бы, например, создать двумерный массив, циклом загрузить в него данные из DataGridView1 и уже одной строчкой выгрузить массив на лист Excel, типа:vb.net1 Range("A1").Resize(Ubound(myArray,1), Ubound(myArray,2)).Value = myArray()Подскажите, как можно взять данные из DataGridView1 в массив ? Обязательно ли это делать циклом? Хорошо бы, что-то такого было бы Dim ds As New DataSet Dim dt As DataTable ds = Me.DataGridView1.DataSource или dt = Me.DataGridView1.DataSource Но ни то, ни то не работает. P.S. Загружаю данные в DataGridView1 вот такvb.net1 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 iPath As String = "F:\VB.NET TEST\Test file.xlsx"     Dim iShtName As String = "Лист1" Dim connectionString As String         Dim connection As OleDb.OleDbConnection           Try             'Для Excel 12.0             connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + iPath + "; Extended Properties=""Excel 12.0 Xml;HDR=YES"";"             connection = New OleDb.OleDbConnection(connectionString)             connection.Open()         Catch ex12 As Exception             Try                 'Для более ранних версий                 connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + iPath + "; Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"                 connection = New OleDb.OleDbConnection(connectionString)                 connection.Open()             Catch ex11 As Exception                 MsgBox("Не знаю такой версии Excel")                 ' Return 0             End Try         End Try         'Выборка данных         Dim command As OleDb.OleDbCommand = connection.CreateCommand()         'command.CommandText = "Select * From [Лист1$]"         'command.CommandText = "Select * From [Лист1$A1:Z100]"         command.CommandText = "Select * From [Лист1$]"         Dim da As New OleDb.OleDbDataAdapter(command)         Dim dt As New Data.DataTable         da.Fill(dt)           With Me.DataGridView1             .AutoGenerateColumns = True              .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders             .BorderStyle = BorderStyle.Fixed3D             .EditMode = DataGridViewEditMode.EditOnEnter             .DataSource = dt         End With           connection.Close()Добавлено через 9 часов 9 минут Пока нашёл/доработал такой способ. Но есть косяк. В одном столбце есть даты, даты забираются из Excel и вставляются в DataGridView1 и дата в DataGridView1 отображается корректно, а вот этим ниже представленным способом дата из DataGridView1 после вставки на лист получается уже другого формата, т.е. вместо нужной даты "01.01.2005" в ячейку вставляется "01.01.2005 0:00:00" Может кто знает, почему формат даты меняется?vb.net1 2 3 4  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click         'сохранить данные         SaveData(iFileFullName, "Лист2") 'адрес и имя книги Excel и имя листа, куда сохранить     End Sub vb.net1 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 63 64 65 66 67 68 69 70 Private Sub SaveData(iPath As String, iShtName As String)         'сохранить данные           Dim ds As New System.Data.DataSet         ds.Tables.Add()         Dim dt As System.Data.DataTable = ds.Tables(0)         Dim dc As System.Data.DataColumn         Dim dr As System.Data.DataRow         Dim colIndex As Integer = 0         Dim rowIndex As Integer = 0           'verfying the datagridview having data or not         If ((DataGridView1.Columns.Count = 0) Or (DataGridView1.Rows.Count = 0)) Then             MessageBox.Show("Нет данных для сохранения!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information)             Exit Sub         End If           'add columns to that table         For i As Integer = 0 To DataGridView1.ColumnCount - 1             ds.Tables(0).Columns.Add(DataGridView1.Columns(i).HeaderText)         Next           'add rows to the table         For i As Integer = 0 To DataGridView1.RowCount - 1             dr = ds.Tables(0).NewRow             For j As Integer = 0 To DataGridView1.Columns.Count - 1                 dr(j) = DataGridView1.Rows(i).Cells(j).Value             Next             ds.Tables(0).Rows.Add(dr)         Next           'массив для данных         Dim myArr(dt.Rows.Count + 1, dt.Columns.Count) As Object           'заголовок         For Each dc In dt.Columns             myArr(0, colIndex) = dc.ColumnName             colIndex = colIndex + 1         Next           'данные         For Each dr In dt.Rows             colIndex = 0             For Each dc In dt.Columns                 myArr(rowIndex + 1, colIndex) = dr(dc.ColumnName)                 colIndex = colIndex + 1             Next             rowIndex = rowIndex + 1         Next           'Excel         xlApp = New Application         xlWB = xlApp.Workbooks.Open(iPath)         xlSht = xlWB.Worksheets(iShtName)           xlSht.Cells.Clear()         xlSht.Range("A1").Resize(UBound(myArr, 1), UBound(myArr, 2)).Value2 = myArr           'украшательства         xlSht.UsedRange.Columns.AutoFit()           xlWB.Close(SaveChanges:=True)         xlApp.Quit()           ReleaseObject(xlSht)         ReleaseObject(xlWB)         ReleaseObject(xlApp)           MessageBox.Show("Данные сохранены!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information)     End Sub

  1. Есть DataGridView1 в ней выведина база... Я вношу изменения в DataGridView1 но он их не сохраняет... Подумал почитал и вот такой код у меня получился на сохранения измененийvb.net1 2 3 4 5 6 7          Try             Dim changes As DataTable = data.GetChanges()             da.Update(changes)             data.AcceptChanges()         Catch ex As Exception             MsgBox("Ошибка сохранения !!!")         End TryНо он сохраняет только изменения в первом столбце... Если изменить второй, третий и т.д то он выдает ошибку "Ссылка на объект не указывает на экземпляр объекта." и выделяет этот кусок vb.net1 Dim changes As DataTable = data.GetChanges()В чем проблема?

  1. Всем привет! Парни, кто работал с sqlite? Столкнулся с проблемой, не понимаю в чем дело. Суть такая. Через LIKE делаю поиск, в ответ получаю фигу. Почему-то поиск не работает. В БД обычный текст на русском. Если у кого-то есть проект с поиском, скиньте пожалуйста пример.

  1. Всем привет. Кто подскажет, почему у меня не получается заполнить DataGridView1 используя BindingSource1 если делаю без BindingSource1, то всё работаетvb.net1 2 3 4 5 Dim sSql As String = "SELECT * FROM [График остатков$A2:S10000]"             myDataAdapter = New OleDb.OleDbDataAdapter(sSql, con)             Dim Table As New DataTable()             myDataAdapter.Fill(Table)             Me.DataGridView1.DataSource = Table 'работает, DGV заполняется данными из листа Excelесли делаю так, vb.net1 2 3 4 5 6 Dim sSql As String = "SELECT * FROM [График остатков$A2:S10000]"             myDataAdapter = New OleDb.OleDbDataAdapter(sSql, con)             Dim Table As New DataTable()             myDataAdapter.Fill(Table)             Me.BindingSource1.DataSource = Table '<---- ЗДЕСЬ ВОЗНИКАЕТ ОШИБКА             DataGridView1.DataSource = Me.BindingSource1На указанной строке выскакивает исключение - Не удается найти столбец [Name] У меня в таблице нет никакого столбца Name. Мне нужно использовать именно BindingSource1, т.к. потом буду фильтровать таблицу по BindingSource1.Filter =

  1. У меня при добавлении строки "1" данные из строки "0" исчезают. Как добавить строку, чтобы данные не пропали? vb.net1 2 3 4 5 6 7            Dim x, y As Int32            y = Form1.DataGridView1.RowCount - 1            If Form1.DataGridView1.Rows(y).Cells(x).Value() <> Nothing Or Form1.DataGridView1.Rows(y).Cells(x).Value() <> "" Then             Form1.DataGridView1.Rows.Add()             y = Form1.DataGridView1.RowCount - 1         End If         Form1.DataGridView1.Rows(y).Cells(x).Value() = Name