none
Cambiar el contenido de una celda mientra escribo en otra RRS feed

  • Pregunta

  • Buenas no consigo que al escribir en una celda me cambie el contenido de otra

    creia que se podia hacer con CellValueChanged del datagridview pero no

    Gracias

    jueves, 16 de junio de 2016 5:56

Todas las respuestas

  • Hola JETET, efectivamente tienes que usar el evento CellValueChanged pero lo que te ocurre es que ese enevto se desencadena al finalizar la edición. Si quieres que se ejecute mientras tecleas puedes usar una técnica del maestro Leandro Tuttini que explica aquí.

    Se trata de incluir esto:

    Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
        If DataGridView1.IsCurrentCellDirty Then
            DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
        End If
    End Sub


    Saludos, Javier J

    jueves, 16 de junio de 2016 6:48
  • 1000 gracias por responder  javier

    lo e puesto a si

    pero me lanza el siguiente error

    Private Sub DGV_Maltas_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DGV_Maltas.CurrentCellDirtyStateChanged
            Dim grid As DataGridView = sender
            If grid.CurrentCell.ColumnIndex = 0 Then
                grid.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
            If DGV_Maltas.IsCurrentCellDirty Then
                DGV_Maltas.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
            Potencial_Fermentables()
        End Sub
        Private Sub DGV_Maltas_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_Maltas.CellValueChanged
            Dim row As DataGridViewRow = DGV_Maltas.CurrentRow
    
            If row IsNot Nothing Then
                If e.ColumnIndex = 1 Then
                    
                    'SUMA TOTAL KILOS
                    Dim SumaKILOS As Decimal = DGV_Maltas.Rows.Cast(Of DataGridViewRow).Sum(Function(x) Convert.ToDecimal(x.Cells("Col_Kilos_Granos_Malta").Value))
                    TextBox7.Text = Math.Round(SumaKILOS, 3)
                    'SUMA TOTAL KILOS
                    'PORCENTAGE DE CADA GRANO
                    For Each row2 As DataGridViewRow In DGV_Maltas.Rows
                        row2.Cells(2).Value = (100 / SumaKILOS) * row2.Cells(1).Value
                    Next
                    'PORCENTAGE DE CADA GRANO
                    Try
    
                    Catch ex As Exception
    
                    End Try
    
    
                End If
            End If
        End Sub

    jueves, 16 de junio de 2016 7:06
  • El error que te da es por alguno de los valores de la columna "Col_Kilos_Granos_Malta" que conviertes a decimal.

    Saludos, Javier J

    jueves, 16 de junio de 2016 7:55
  • Nada de nada 

    ahora estoy usando esto y nada 

    No se por que me da de resultado en el error 0D

    Private Sub DGV_Maltas_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DGV_Maltas.CurrentCellDirtyStateChanged
    
            Dim grid As DataGridView = sender
            If grid.CurrentCell.ColumnIndex = 0 Then
                grid.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
            If grid.CurrentCell.ColumnIndex = 1 Then
                grid.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
            Potencial_Fermentables()
        End Sub
        Sub Porcentage_Maltas()
            Dim row As DataGridViewRow = DGV_Maltas.CurrentRow
    
            If row IsNot Nothing Then
                )
                'SUMA TOTAL KILOS
                Dim total As Decimal = 0
                For Each row1 As DataGridViewRow In DGV_Maltas.Rows
                    total = total + CDbl(row1.Cells(1).Value)
                Next
                'SUMA TOTAL KILOS
                'PORCENTAGE DE CADA GRANO
                For Each row2 As DataGridViewRow In DGV_Maltas.Rows
    
                    row2.Cells(2).Value = (100 / total) * row2.Cells(1).Value
    
                Next
                'PORCENTAGE DE CADA GRANO
                Try
    
                Catch ex As Exception
    
                End Try
    
    
                'End If
            End If
        End Sub
        Private Sub DGV_Maltas_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_Maltas.CellValueChanged
            
            If e.ColumnIndex = 1 Then
                
                Call Porcentage_Maltas()
    
            End If
           
        End Sub


    • Editado JETET jueves, 16 de junio de 2016 15:24
    jueves, 16 de junio de 2016 15:22
  • Mira, lo que pasa es que no es buena costumbre dar por supuesto que el dato que vamos a procesar va a ser del tipo que esperamos (mucho menos si hay usuarios en medio).

    EN lugar de hacer 

    total = total + CDbl(row1.Cells(1).Value)

    Haz esto para prevenir que el dato de la celda no se pueda convertir a Double:

    Dim ValorDbl as Double

    If Double.TryParse(row1.Cells(1).Value, ValorDbl) Then

        total = total + ValorDbl

    End If


    Saludos, Javier J

    jueves, 16 de junio de 2016 17:04