none
Invisibilizar contenido de celda en columna especifica de DataGridView RRS feed

  • Pregunta

  • Buenas tardes a todos.

    La consulta es ver como puedo recorrer con un bucle el contenido de columnas especificas de un DGV y aquellas Celdas que contengan 0 (Cero), no sea visible. Son tres o cuatro columnas que ese bucle debiera recorrer e ir verificando que las celdas que tengan 0 sea invisible.

    For Each Row As DataGridViewRow In Me.DataGridView1.Rows
    Dim Valor As Integer = Row.Cells("Neto").Value
    If Valor = 0 Then
     'Row.Cells("Neto").Value = True

    End If
    Next

    Desde ya muchas gracias por la posible ayuda.

    Saludos.

    miércoles, 11 de septiembre de 2019 16:08

Todas las respuestas

  • Puedes usar el evento CellFormatting del DataGridView:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If Not Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value Is Nothing Then
            If Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString = "0" Then Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ""
        End If
    End Sub


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio jueves, 12 de septiembre de 2019 17:21
    jueves, 12 de septiembre de 2019 7:28
  • Puedes usar el evento CellFormatting del DataGridView:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If Not Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value Is Nothing Then
            If Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString = "0" Then Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ""
        End If
    End Sub


    Saludos, Javier J

    Hola Javier. Buen día y gracias por responder.

    El tema es que en realidad el valor no debe eliminarse o cambiado por " ", dado que esa es una columna que opera con tipo de dato Decimal. El (Cero 0) debe permanecer, solo que sin ser visible.

    Esa o esas columnas porque son mas de una, van registrando una suma, (Botón mediante), la cual se va viendo en un Lable del Form.  Por eso solo se debe Ocultar el contenido de las celdas cuyo valor sea Cero.

    Vuelvo agradecer tu aporte. Si se te ocurre algo que me tienda una mano... buenísimo.

    Abrazo.

    Claudio

    • Propuesto como respuesta Pablo Rubio jueves, 12 de septiembre de 2019 17:21
    jueves, 12 de septiembre de 2019 11:43
  • Puedes usar el mismo evento pero poniendo este código

    If Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString = "0" Then
        Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor
    End If

    De esta forma no se ve el dato porque se muestra con el mismo color que el fondo.


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio viernes, 13 de septiembre de 2019 17:06
    viernes, 13 de septiembre de 2019 6:10
  • Hola Javier.

    Ahí probé el código que me pasaste pero no pasa el color del ForeColor al mismo que el BackColor. Sigue viéndose el 0 en las celdas.

    Te adjunto Imagen para que veas que en las Col. Materia Prima, Gasto_Fabric y Neto, aparece el 0 (Cero).

    El código que me propusiste, lo puse en el evento Cell Formatting, pero nada...

      

    • Propuesto como respuesta Pablo Rubio viernes, 13 de septiembre de 2019 17:06
    viernes, 13 de septiembre de 2019 16:13
  • Usa este código:

        Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

            Dim Celda As DataGridViewCell = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex)

            If Not Celda.Value Is Nothing Then

                If Celda.Value.ToString.Replace(" ", "") = "0" Then
                    e.CellStyle.ForeColor = e.CellStyle.BackColor
                End If

            End If
        End Sub

    Si el usuario puede editar el contenido de las celdas debes poner algo como esto para que muestre el valor cuando cambia una celda que contenía cero:

        Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

            e.CellStyle.ForeColor = Color.Black

        End Sub


    Saludos, Javier J

    lunes, 16 de septiembre de 2019 6:27
  • Hola:

    Prueba de cambiar el formato de número de la columna:

    DataGridView1.Columns("Neto").DefaultCellStyle.Format = "0;-0;"

    El punto y coma (;) hace de separador y le especificas como quieres mostrar los valores numéricos.

    La primera sección es el formato para valores positivos, la segunda sección es para valores negativos, y la tercera para el valor 0, que es lo que te interesa. Como no quieres mostrar nada, la dejas vacía.

    https://docs.microsoft.com/es-es/dotnet/api/system.windows.forms.datagridviewcellstyle.format?view=netframework-4.8

    Un saludo

    lunes, 16 de septiembre de 2019 8:34
  • Hola:
    En un Form con 1 DGV, copia y pega el siguiente codigo
    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form2
        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim lsCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=NorthWind;Integrated Security=True"
                Dim lsQuery As String = "SELECT ProductID, ProductName, UnitsOnOrder, ReorderLevel FROM Products"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    '
                    Me.DataGridView1.DataSource = loDataTable
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
            If IsNothing(e.Value) = True Then
                Return
            End If
            If Me.DataGridView1.Columns("UnitsOnOrder").Index = e.ColumnIndex Or Me.DataGridView1.Columns("ReorderLevel").Index = e.ColumnIndex Then
                Dim ValorCelda As Decimal
                ValorCelda = CType(e.Value, Decimal)
                Select Case ValorCelda
                    Case = CDec(0)
                        e.CellStyle.BackColor = e.CellStyle.ForeColor
                    Case Else
                        e.CellStyle.BackColor = Color.GreenYellow
                End Select
            End If
        End Sub
    End Class

    El resultado es el siguiente

    Un saludo desde Bilbo
    Carlos

    miércoles, 18 de septiembre de 2019 17:57