none
Llamar a rutinas cuando se detecta un cambio en las celdas del data DataGridView RRS feed

  • Pregunta

  • Hola a todos,

    estoy trabajando en un proyecto y me he encontrado con un problema que no se resolver. Se trata de un proyecto Forms en VB.net Sucede lo siguiente:

    Tengo dos formularios (FormStart y FormMain). Una vez que ejecuto el programa se muestra el "FormStart" y ejecutopara conectarme a una base de datos de Access. Tras pulsar un botón en el "FormStart", éste se esconde y se muestra el "FormMain".

    El "El FormMain" dispone de un DataGridView que se rellena con los datos de la base de datos a través de la conexión previamente realizada.

    Estos datos se disponen en 3 columnas en el DataGridView (La primera columna es un "CheckBox" al que llamo "Check", la segunda un "TextBox" llamado "Line" y la tercera un "ComboBox" llamado "Reason"). Mi problema se centra en la primera y ultima columna, es decir "Check" y "Reason"


    Pues bien. Requiero que cuando realice cambios en las celdas Check y Reason se ejecuten cambios. Estos son, por ejemplo:

    - Si Check = False pero se selecciona una opción del ComboBox "Reason", automáticamente Check = True

    - Si hay seleccionada una opción del ComboBox "Reason" y cambiamos el estado de Check de False a True, automáticamente ComboBox = Null

    Etc.

    Pues bien, he probado llamando a estas rutinas desde diferentes eventos del DataGrid como son:

    - CellStateChanged

    - CellLeave

    *El problema de estos dos eventos es que por una razón que desconozco, cuando inicializo el "FormMain" no se me cargan todos los datos. La columna del ComboBox "Reason" no se carga (no aparece directamente dicha columna). Puede ser porque el programa ejecuta ya estos eventos y hay conflicto interno.

    - CurrentCellDirtyStateChanged: esta rutina funciona pero no como yo querría ya que las rutinas que yo tengo programadas en este evento se ejecutan una vez abandono la celda que he modificado. Es decir, si Check = True y lo clickeo haciendo que Check = False, no se me ejecuta la rutina que me borra el contenido del ComboBox "Reason" hasta que no clickeo en otra celda.

    Pues bien. Este es mi problema.

    ¿Alguien conoce algún otro evento que pueda usar que sirva para este propósito? o ¿Hay alguna manera de hacerlo con las funciones que ya he probado para que funcione correctamente?

    Espero haberme explicado lo mejor posible, ya que es un poco complicado.

    Gracias a todos de antemano. Un saludo

    lunes, 2 de noviembre de 2015 10:37

Respuestas

  • El problema es que la celda está en modo de edición hasta que pierde el foco y hasta ese momento no salta el evento ValueChanged.

    Lo que puedes hacer es confirmar el cambio en el evento CurrentCellDirtyStateChanged para forzar que salte el evento ValueChanged en el momento que cambie el valor seleccionado o el valor del check:

        Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
            Dim grid =CType(sender,DataGridView)
            Dim columnName As String=grid.Columns(grid.CurrentCell.ColumnIndex).Name
            If columnName="Check" OrElse columnName="Reason" Then
                grid.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
        End Sub
    
        Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
            Dim grid=CType(sender,DataGridView)
            Select Case grid.Columns(e.ColumnIndex).Name
                Case "Check"
                    Dim checkCell As DataGridViewCheckBoxCell= grid.Rows(e.RowIndex).Cells(e.ColumnIndex)
                    If Not checkCell.Value Then
                        grid.Rows(e.RowIndex).Cells("Reason").Value=Nothing
                    End If
                Case "Reason"
                    If grid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value<>Nothing Then
                        grid.Rows(e.RowIndex).Cells("Check").Value=True
                    End If
            End Select
        End Sub

    En cuanto a los problemas en la carga inicial habría que ver el código para poder ver dónde está el problema.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 2 de noviembre de 2015 11:46

Todas las respuestas

  • El problema es que la celda está en modo de edición hasta que pierde el foco y hasta ese momento no salta el evento ValueChanged.

    Lo que puedes hacer es confirmar el cambio en el evento CurrentCellDirtyStateChanged para forzar que salte el evento ValueChanged en el momento que cambie el valor seleccionado o el valor del check:

        Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
            Dim grid =CType(sender,DataGridView)
            Dim columnName As String=grid.Columns(grid.CurrentCell.ColumnIndex).Name
            If columnName="Check" OrElse columnName="Reason" Then
                grid.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
        End Sub
    
        Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
            Dim grid=CType(sender,DataGridView)
            Select Case grid.Columns(e.ColumnIndex).Name
                Case "Check"
                    Dim checkCell As DataGridViewCheckBoxCell= grid.Rows(e.RowIndex).Cells(e.ColumnIndex)
                    If Not checkCell.Value Then
                        grid.Rows(e.RowIndex).Cells("Reason").Value=Nothing
                    End If
                Case "Reason"
                    If grid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value<>Nothing Then
                        grid.Rows(e.RowIndex).Cells("Check").Value=True
                    End If
            End Select
        End Sub

    En cuanto a los problemas en la carga inicial habría que ver el código para poder ver dónde está el problema.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 2 de noviembre de 2015 11:46
  • Hola Asier,

    muchas gracias por la respuesta. Creo que tienes razón en la explicación que das. Voy a probar el código y comento.

    Un saludo!

    lunes, 2 de noviembre de 2015 14:12