none
Formatar linha do DatagridView, caso encontre valor repetido VB.Net RRS feed

  • Pergunta

  • Boa noite pessoal!

    Preciso de uma ajuda, com o seguinte:

    Tenho um DataGridView, onde uma coluna tem o total de votos, ocorre que, se caso esse total se repetisse em alguma linha, ele formatasse a linha, e alterasse o texto de outra coluna. Exemplo: 

    Se na coluna TOTAL, apresentasse dois valores  25, na coluna ORDEM, retornasse EMPATE, e colorir essas duas linhas. 

    Achei um código, aqui mesmo no Fórum, mas não consigo adaptá-lo:

    Private Sub DataGridView_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView.CellFormatting
            If e.ColumnIndex = 3 Then
    
                If (e.Value IsNot Nothing) And (e.Value.ToString() = 2) Then   '<-- SÓ COLOQUEI e.Value.ToString() 2 PARA TESTAR
                    e.Value = "EMPATE"
    
                    e.CellStyle.BackColor = Color.Orange
    
                    Dim oRow As DataGridViewRow = dgvApuracao.Rows(e.RowIndex)
                    oRow.DefaultCellStyle.BackColor = Color.Orange
                End If
            End If
    End Sub

    Na ColumnIndex 3 ele retornou EMPATE e coloriu a linha, mas precisava que retornasse EMPATE na ColumnIndex 0, só quando houvesse valores repetidos na ColumnIndex 3.

    Agradeço desde já a ajuda.

    Ivan Jpi


    • Editado IVAN JPI quarta-feira, 30 de dezembro de 2020 22:46
    quarta-feira, 30 de dezembro de 2020 22:43

Respostas

  • Ivan,

       Montei desta forma (acabei puxando para 2 variáveis o conteúdo da DataGridView):

    Private Sub btnComparaValor_Click(sender As Object, e As EventArgs) Handles btnComparaValor.Click
    
        If DataGridView1.Rows.Count > 1 Then
    
            Dim dt1 As DataGridView = DataGridView1
            Dim dt2 As DataGridView = DataGridView1
    
            For i As Integer = 0 To dt1.Rows.Count - 1
    
                For j As Integer = (i + 1) To dt1.Rows.Count - 1
    
                    If dt1.Rows(i).Cells("Nome").Value = dt2.Rows(j).Cells("Nome").Value Then
    
                        DataGridView1.Rows(i).Cells("Nome").Style.BackColor = Color.Gainsboro
                        DataGridView1.Rows(j).Cells("Nome").Style.BackColor = Color.Gainsboro
    
                        DataGridView1.Rows(i).Cells("Observacao").Value = "EMPATE"
                        DataGridView1.Rows(j).Cells("Observacao").Value = "EMPATE"
    
                    End If
    
                Next
    
            Next
    
        End If
    
    End Sub


       Criei um novo botão em um exemplo antigo que eu tinha...

          Acho que também dá para fazer usando "For Each" e "FIND"... talvez fique melhor.

    []'s,
    Fabio I.

    • Marcado como Resposta IVAN JPI sexta-feira, 1 de janeiro de 2021 01:10
    • Editado Fabio I quarta-feira, 6 de janeiro de 2021 11:40
    quinta-feira, 31 de dezembro de 2020 21:20

Todas as Respostas

  • IVAN,

        Para retornar "empate" na ColumnIndex 0, o código precisa saber que também precisa alterar esta coluna!

        Você vai comparar TODAS as Colunas X TODAS as Colunas?
        Se sim, você precisa de um duplo FOR (um for dentro de outro), pois o código precisa saber quais colunas ele vai mudar, por exemplo:

    For indexColA = 1 To 3
    
        'Aqui você posiciona a a grid com o "IndexA" e
        'Captura o valor que quer comparar guardando em uma variável "varA"
    
        'Somente a partir daquele ponto até o fim da grade 
        '(não precisa comparar o que já foi comparado)
        For indexColB = indexColA To 3
    
     	'Aqui você posiciona a a grid com o "IndexB" e
        	'Captura o valor que quer comparar guardando em uma variável "varB"
    
             If (e.Value IsNot Nothing)
    
    		if (varA = varB) Then 
    	             e(indexColA).Value = "EMPATE"
    	             e(indexColB).Value = "EMPATE"
                         e(indexColA).CellStyle.BackColor = Color.Orange
                         e(indexColB).CellStyle.BackColor = Color.Orange
    		End If
             End If	
    
        Next indexColB
    
    Next indexColA


        Eu esqueci os comandos exatos da Grade no VB.Net, mas se você NÃO entender minha ideia acima eu tento fazer para você.

        Veja também (a primeira com For Each):

    ============================================================
    How to compare 2 datagridview columns for duplicates vb.net

    https://stackoverflow.com/questions/44545213/how-to-compare-2-datagridview-columns-for-duplicates-vb-net
    ============================================================
    How can I compare 2 datagridview with different values

    https://www.codeproject.com/Questions/1196048/How-can-I-compare-datagridview-with-different-valu
    ============================================================
    How to compare cell values of datagridview with each other

    https://www.daniweb.com/programming/software-development/threads/455989/how-to-compare-cell-values-of-datagridview-with-each-other
    ============================================================
    Comparar os valores de uma coluna inteira do DataGridView com uma variável

    https://pt.stackoverflow.com/questions/3772/comparar-os-valores-de-uma-coluna-inteira-do-datagridview-com-uma-vari%C3%A1vel
    ============================================================
    VB .NET - Usando e Abusando do DataGridView

    http://www.macoratti.net/vbn5_udv.htm
    ============================================================


    []'s,
    Fabio I. 

    • Editado Fabio I quinta-feira, 31 de dezembro de 2020 10:11
    quinta-feira, 31 de dezembro de 2020 10:05
  • Ola,

    O artigo abaixo também tem umas dicas boas em como usar DatagridView com VB.net

    https://www.go4expert.com/articles/introduction-datagridview-control-vbnet-t30219/
    quinta-feira, 31 de dezembro de 2020 12:29
    Moderador
  • Bom dia!

    Não consegui implementar o código, se puder dar àquela ajuda, ficarei imensamente agradecido.

    Dá erro:

    System.MissingMemberException: 'Nenhum membro padrão encontrado para o tipo 'Integer'.'


    Feliz ano novo, saúde e paz, o resto a gente corre atrás.

    Ivan Jpi

    quinta-feira, 31 de dezembro de 2020 14:29
  • Ivan,

       Montei desta forma (acabei puxando para 2 variáveis o conteúdo da DataGridView):

    Private Sub btnComparaValor_Click(sender As Object, e As EventArgs) Handles btnComparaValor.Click
    
        If DataGridView1.Rows.Count > 1 Then
    
            Dim dt1 As DataGridView = DataGridView1
            Dim dt2 As DataGridView = DataGridView1
    
            For i As Integer = 0 To dt1.Rows.Count - 1
    
                For j As Integer = (i + 1) To dt1.Rows.Count - 1
    
                    If dt1.Rows(i).Cells("Nome").Value = dt2.Rows(j).Cells("Nome").Value Then
    
                        DataGridView1.Rows(i).Cells("Nome").Style.BackColor = Color.Gainsboro
                        DataGridView1.Rows(j).Cells("Nome").Style.BackColor = Color.Gainsboro
    
                        DataGridView1.Rows(i).Cells("Observacao").Value = "EMPATE"
                        DataGridView1.Rows(j).Cells("Observacao").Value = "EMPATE"
    
                    End If
    
                Next
    
            Next
    
        End If
    
    End Sub


       Criei um novo botão em um exemplo antigo que eu tinha...

          Acho que também dá para fazer usando "For Each" e "FIND"... talvez fique melhor.

    []'s,
    Fabio I.

    • Marcado como Resposta IVAN JPI sexta-feira, 1 de janeiro de 2021 01:10
    • Editado Fabio I quarta-feira, 6 de janeiro de 2021 11:40
    quinta-feira, 31 de dezembro de 2020 21:20
  • Olá Fábio, funcionou perfeitamente, agradeço a disposição.

    Feliz ano novo! Saúde e paz, o resto a gente corre atrás.

    Ivan Jpi

    sexta-feira, 1 de janeiro de 2021 01:09
  • Ivan,

       Montei mais duas formas de fazer:

       A "2" é muito parecida com a "1", mas dispensei uma variável:

    Private Sub btnComparaValor2_Click(sender As Object, e As EventArgs) Handles btnComparaValor2.Click
        Dim dt1 As DataGridView = DataGridView1
    
        If DataGridView1.Rows.Count > 1 Then
    
            For Each row As DataGridViewRow In DataGridView1.Rows
    
                For i As Integer = (row.Index + 1) To dt1.Rows.Count - 1
    
                    If row.Cells.Item("Nome").Value = dt1.Rows(i).Cells("Nome").Value Then
                        DataGridView1.Rows(i).Cells("Nome").Style.BackColor = Color.Gainsboro
                        DataGridView1.Rows(i).Cells("Observacao").Value = "EMPATE"
    
                        DataGridView1.Rows(row.Index).Cells("Nome").Style.BackColor = Color.Gainsboro
                        DataGridView1.Rows(row.Index).Cells("Observacao").Value = "EMPATE"
                    End If
    
                Next
    
            Next
    
        End If
    
    End Sub

       Aqui na "3" usei o "For Each" e o "Fin", mas o Find é do "Dataview":

    Private Sub btnComparaValor3_Click(sender As Object, e As EventArgs) Handles btnComparaValor3.Click
        Dim dv1 As New DataView()
        Dim intIndex As Integer
        Dim strNome As String
    
        dv1 = CType(DataGridView1.DataSource, DataView)
        dv1.Sort = "Nome ASC"
    
        If DataGridView1.Rows.Count > 1 Then
    
            For Each row As DataGridViewRow In DataGridView1.Rows
    
                strNome = row.Cells.Item("Nome").Value
                intIndex = dv1.Find(strNome)
    
                If intIndex <> row.Index And intIndex <> -1 Then
                    DataGridView1.Rows(intIndex).Cells("Nome").Style.BackColor = Color.Gainsboro
                    DataGridView1.Rows(intIndex).Cells("Observacao").Value = "EMPATE"
    
                    DataGridView1.Rows(row.Index).Cells("Nome").Style.BackColor = Color.Gainsboro
                    DataGridView1.Rows(row.Index).Cells("Observacao").Value = "EMPATE"
                End If
    
            Next
    
        End If
    
    End Sub

    Feliz Ano Novo!

    []'s,
    Fabio I.

    • Editado Fabio I sexta-feira, 1 de janeiro de 2021 01:35
    sexta-feira, 1 de janeiro de 2021 01:32