none
Evento datagridview

    Pregunta

  • Hola, como puedo hacer para que cuando se modifique el valor de la celda de un registros mientras el sistema se esta ejecutándo se ejecuten estas instrucciones, me refiero a en que evento puedo ponerlas.

    En el evento "CellFormatting" me las ejecuta solo al cargar el datagridview

       If Convert.ToInt32(DataGridView1("CantidadStock", e.RowIndex).Value) = 0 Then
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            End If
    
            If Convert.ToInt32(DataGridView1("CantidadStock", e.RowIndex).Value) <= 5 And Convert.ToInt32(DataGridView1("CantidadStock", e.RowIndex).Value) >= 1 Then
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Firebrick
            End If

    A los valores de la celdas los modifico asi:

     
      'Obtener una referencia a la fila actualmente seleccionada
            Dim Fila As DataGridViewRow = DataGridView2.CurrentRow
    
            If Fila IsNot Nothing Then 'Si existe una referencia válida
    
                'Obtener los valores de la fila a quitar
                Dim Producto As String = CStr(Fila.Cells("Column1").Value)
                Dim Cantidad As Int32 = CInt(Fila.Cells("Column2").Value)
    
                Label14.Text -= Convert.ToInt32(Fila.Cells("Column2").Value)
                txttotal.Text -= Convert.ToDecimal(Fila.Cells("Column3").Value)
                txtsubtotal.Text -= Convert.ToDecimal(Fila.Cells("Column3").Value)
    
                'Quitar la fila
                DataGridView2.Rows.Remove(Fila)
    
                'Encontrar la fila según el producto que se ha quitado
                Dim FilaActualizar As DataGridViewRow =
                    DataGridView1.Rows.Cast(Of DataGridViewRow)().
                Where(Function(r) Convert.ToString(r.Cells("Nombre").Value) = Producto).
                FirstOrDefault()
    
                If FilaActualizar IsNot Nothing Then 'Acumular la cantidad
                    FilaActualizar.Cells("CantidadStock").Value += Cantidad
                End If
            End If

    Saludos

    miércoles, 4 de enero de 2017 23:37

Respuestas

  • Federico3213,

    El evento CellFormatting se va desencadenar cada vez que el valor contenido en una celda requiera ser formateado y eso no sólo se produce en la carga, quizá el nuevo valor asignado no pasa la evaluación que implementas y por tanto no ves cambio, intenta lo siguiente:

    Private Sub DataGridView1_CellFormatting(sender As Object, ...
    
    	Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    
    	If dgv.Columns(e.ColumnIndex).Name = "CantidadStock" Then
    		If e.Value IsNot Nothing Then
    			dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor =
    				If(CInt(e.Value) = 0, Color.Red,
    					IIf(CInt(e.Value) >= 1 AndAlso CInt(e.Value) <= 5,
    						Color.Firebrick, Color.Pink))
    		End If
    	End If
    
    End Sub

    Nota que las celdas que contengan valores mayores a 5 o menores a 0 serán pintados de color rosa.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 5 de enero de 2017 0:33
    jueves, 5 de enero de 2017 0:19

Todas las respuestas

  • Federico3213,

    El evento CellFormatting se va desencadenar cada vez que el valor contenido en una celda requiera ser formateado y eso no sólo se produce en la carga, quizá el nuevo valor asignado no pasa la evaluación que implementas y por tanto no ves cambio, intenta lo siguiente:

    Private Sub DataGridView1_CellFormatting(sender As Object, ...
    
    	Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    
    	If dgv.Columns(e.ColumnIndex).Name = "CantidadStock" Then
    		If e.Value IsNot Nothing Then
    			dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor =
    				If(CInt(e.Value) = 0, Color.Red,
    					IIf(CInt(e.Value) >= 1 AndAlso CInt(e.Value) <= 5,
    						Color.Firebrick, Color.Pink))
    		End If
    	End If
    
    End Sub

    Nota que las celdas que contengan valores mayores a 5 o menores a 0 serán pintados de color rosa.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 5 de enero de 2017 0:33
    jueves, 5 de enero de 2017 0:19
  • Gracias me sirvió tu respuesta.

    Lo que pude hacer yo es esto pero solo pinta la celda con alguna modificación mas se puede llegar al pintar la fila también, tu código me sirvió ya que pinta toda la celda.

     For Each Row As DataGridViewRow In DataGridView1.Rows
    
                If Row.Cells("CantidadStock").Value = 0 Then
                    Row.Cells("CantidadStock").Style.BackColor = Color.Red
                End If
    
                If Row.Cells("CantidadStock").Value <= 5 And Row.Cells("CantidadStock").Value >= 1 Then
                    Row.Cells("CantidadStock").Style.BackColor = Color.Firebrick
                End If
    
                If Row.Cells("CantidadStock").Value >= 6 Then
                    Row.Cells("CantidadStock").Style.BackColor = Color.White
                End If
            Next

    jueves, 5 de enero de 2017 0:33
  • Federico3213,

    Pero si un sólo valor cambia, ¿por qué recorres todas las filas?

    Si deseas pintar toda la fila entonces accede a la propiedad DefaultCellStyle():

    Row.DefaultCellStyle.BackColor = Color.Red


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 5 de enero de 2017 0:49