none
Controlar las celdas de una columna de checkbox RRS feed

  • Pregunta

  • Hola amig@s.

    Necesito saber si en una columna de checkboxes hay más de una celda chequeada para, en función del resultado, activar o desactivar un botón de borrado.

    Os lo explico con unas capturas:

    1º Activando el checkbox "Seleccionar", se muestra una columna en el datagrid que me permite seleccionar registros a borrar.

    2º Procedo a seleccionar uno o varios registros. En este punto, indico al botón BORRAR que se active.

    3º Ahora viene el problema, y es que el botón BORRAR se activa(desactiva alternativamente aunque tenga más de 1 registro seleccionado.

    El código insertado en el evento es:

    Private Sub dgvListado_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvListado.CellContentClick
    
            If e.ColumnIndex = Me.dgvListado.Columns.Item("Eliminar").Index Then
                Dim chkCell As DataGridViewCheckBoxCell = Me.dgvListado.Rows(e.RowIndex).Cells("Eliminar")
                chkCell.Value = Not chkCell.Value
                If chkCell.Value = False Then
                    btnBorrar.Enabled = False
                Else
                    btnBorrar.Enabled = True
                End If
            End If
        End Sub

    ¿Cómo corrijo esto para que detecte que hay 1 o más registros chequeados y pueda desactivar el botón?

    Gracias por anticipado!!

    sábado, 3 de junio de 2017 14:55

Respuestas

  • Por cada cambio de estado del CheckBox incrustado en la celda debes validar el estado del mismo en las demás filas, si por lo menos una celda tiene el estado True entonces se establece el valor True a la propiedad Enabled del botón caso contrario se establece el valor False, por ejemplo:

    Private Sub dgvListado_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs)
    
    	Dim dgv = DirectCast(sender, DataGridView)
    
    	If dgv.IsCurrentCellDirty Then
    		dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
    	End If
    
    End Sub
    
    Private Sub dgvListado_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)
    
    	Dim dgv = DirectCast(sender, DataGridView)
    
    	If dgv.Columns(e.ColumnIndex).Name = "Eliminar" Then
    		btnBorrar.Enabled = dgv.Rows.Cast(Of DataGridViewRow)().
    			Any(Function(x) Convert.ToBoolean(x.Cells("Eliminar").Value))
    	End If
    
    End Sub

    Entiendo que el valor de la propiedad Enabled del botón debe inicializarse en False.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta R_Jorge sábado, 3 de junio de 2017 19:27
    sábado, 3 de junio de 2017 17:43

Todas las respuestas

  • Por cada cambio de estado del CheckBox incrustado en la celda debes validar el estado del mismo en las demás filas, si por lo menos una celda tiene el estado True entonces se establece el valor True a la propiedad Enabled del botón caso contrario se establece el valor False, por ejemplo:

    Private Sub dgvListado_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs)
    
    	Dim dgv = DirectCast(sender, DataGridView)
    
    	If dgv.IsCurrentCellDirty Then
    		dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
    	End If
    
    End Sub
    
    Private Sub dgvListado_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)
    
    	Dim dgv = DirectCast(sender, DataGridView)
    
    	If dgv.Columns(e.ColumnIndex).Name = "Eliminar" Then
    		btnBorrar.Enabled = dgv.Rows.Cast(Of DataGridViewRow)().
    			Any(Function(x) Convert.ToBoolean(x.Cells("Eliminar").Value))
    	End If
    
    End Sub

    Entiendo que el valor de la propiedad Enabled del botón debe inicializarse en False.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta R_Jorge sábado, 3 de junio de 2017 19:27
    sábado, 3 de junio de 2017 17:43
  • Private Sub dgvListado_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)

    dim filasSelec as integer = 0

    for each filaAct as datagridviewrow in datagridview.rows

    if filaAct.cells(0).value = true then

    filasSelec += 1

    end if

    next

    if filasselec >= 1 then

    btnBorrar.enabled = true

    else

    btnBorrar.enabled = false

    end if

    end sub

    espero me comprendas la idea
    sábado, 3 de junio de 2017 19:11
  • Muchas gracias! funciona a la perfección. 

    Al principio me volví loco porque me apresuré a copiar, pegar y probar sin reparar que falta la coletilla del manejador al final de las funciones y claro, no rulaba jejeje.. pero nada, todo ok! perfecto, gracias de nuevo.

    sábado, 3 de junio de 2017 19:29
  • Gracias por tu respuesta. En realidad ese era mi plan B viendo que no daba con lo que quería, pero estaba empeñado en alternar el botón según estuvieran marcadas o no las filas.

    sábado, 3 de junio de 2017 19:31