none
Problemas con columnas CheckBox RRS feed

  • Pregunta

  • Hola a todos ! Necesito una ayuda. 

    Estoy haciendo una planilla de Asistencias en VB.NET. La primer columna, identifica al personal. Las siguientes 4, las posibles asistencias a un evento (Asiste, No Asiste, Tardanza, No Asiste Justificado)

    He cargado la datagridview y necesito que al hacer click en una opcion, se destilden todas las demas de esa misma fila. De esta forma, solo habrá una opcion registrada para cada persona.

    Probe con los eventos DirtyStateChanged y CellValue_Changed, pero me destildan ademas todas las demas opciones de las filas restantes.

    Alguien sabe como tomar tal validacion ? Muchas gracias !!

    El problema es: tildo la opcion Asiste para Pablo Diaz. Al seleccionar tambien Asiste en Perez, la opcion de Diaz se me destilda ...

    • Editado rlavisse martes, 17 de noviembre de 2015 23:06
    martes, 17 de noviembre de 2015 23:00

Respuestas

  • Hola:
    En un Form con 1 DataGridView, copia y pega el siguiente codigo

    Public Class Form1

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            lP_AddTextColumn("NOMBRE", 0)
            lP_AddCheckColumn("Asiste", 1)
            lP_AddCheckColumn("NO Asiste", 2)
            lP_AddCheckColumn("Tardanza", 3)
            lP_AddCheckColumn("Justificado", 4)
        End Sub

        Private Sub lP_AddTextColumn(ByVal vsNombre As String, ByVal viPosicion As Integer)
            Dim column As New DataGridViewTextBoxColumn()
            With column
                .HeaderText = vsNombre
                .Name = vsNombre
                .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
                .CellTemplate = New DataGridViewTextBoxCell()
                .CellTemplate.Style.BackColor = Color.Beige
            End With
            DataGridView1.Columns.Insert(viPosicion, column)
        End Sub

        Private Sub lP_AddCheckColumn(ByVal vsNombre As String, ByVal viPosicion As Integer)
            Dim column As New DataGridViewCheckBoxColumn()
            With column
                .HeaderText = vsNombre
                .Name = vsNombre
                .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
                .FlatStyle = FlatStyle.Standard
                .CellTemplate = New DataGridViewCheckBoxCell()
                .CellTemplate.Style.BackColor = Color.Beige
            End With
            DataGridView1.Columns.Insert(viPosicion, column)
        End Sub

        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Or e.ColumnIndex = 0 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            loFila.Cells("Asiste").Value = False
            loFila.Cells("NO Asiste").Value = False
            loFila.Cells("Tardanza").Value = False
            loFila.Cells("Justificado").Value = False
        End Sub
    End Class

    P.D.
    Inserta varios nombres y haz click en los checkbox

    Un saludo desde Bilbo
    Carlos

    miércoles, 18 de noviembre de 2015 9:25

Todas las respuestas

  • Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            Dim senderGrid As DataGridView = sender
            If senderGrid.Columns(e.ColumnIndex) Is DataGridView1.Columns("Column2") Then
                senderGrid.Columns(e.ColumnIndex).Selected = True
            End If
    
        End Sub

    así detectas la clumna
    miércoles, 18 de noviembre de 2015 8:52
  • Para tener el valor real del CheckBox debes utilizar el evento CurrentCellDirtyStateChanged para que se apliquen los posibles cambios sin confirmar. Esto se hace con este código 

    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

    Luego, en el evento CellValueChanged debes poner el código que te controle que solo un check se pueda marcar en cada fila. Algo como esto:

    Private Sub DataGridView1_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

        If e.RowIndex >= 0 Then
            If e.ColumnIndex = 1 Or e.ColumnIndex = 2 Or e.ColumnIndex = 3 Then  ' las columnas que sean CheckBox

                Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)

                Dim isChecked As Boolean = DataGridView1(0, e.RowIndex).FormattedValue

                If isChecked Then

                    For Col As Integer = 1 To 3 ' El nº de columnas que sean
                        If Col <> e.ColumnIndex Then
                            row.Cells(Col).Value = False
                        End If
                    Next

                End If
            End If
        End If
    End Sub


    Saludos, Javier J

    miércoles, 18 de noviembre de 2015 9:00
  • Hola:
    En un Form con 1 DataGridView, copia y pega el siguiente codigo

    Public Class Form1

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            lP_AddTextColumn("NOMBRE", 0)
            lP_AddCheckColumn("Asiste", 1)
            lP_AddCheckColumn("NO Asiste", 2)
            lP_AddCheckColumn("Tardanza", 3)
            lP_AddCheckColumn("Justificado", 4)
        End Sub

        Private Sub lP_AddTextColumn(ByVal vsNombre As String, ByVal viPosicion As Integer)
            Dim column As New DataGridViewTextBoxColumn()
            With column
                .HeaderText = vsNombre
                .Name = vsNombre
                .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
                .CellTemplate = New DataGridViewTextBoxCell()
                .CellTemplate.Style.BackColor = Color.Beige
            End With
            DataGridView1.Columns.Insert(viPosicion, column)
        End Sub

        Private Sub lP_AddCheckColumn(ByVal vsNombre As String, ByVal viPosicion As Integer)
            Dim column As New DataGridViewCheckBoxColumn()
            With column
                .HeaderText = vsNombre
                .Name = vsNombre
                .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
                .FlatStyle = FlatStyle.Standard
                .CellTemplate = New DataGridViewCheckBoxCell()
                .CellTemplate.Style.BackColor = Color.Beige
            End With
            DataGridView1.Columns.Insert(viPosicion, column)
        End Sub

        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Or e.ColumnIndex = 0 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            loFila.Cells("Asiste").Value = False
            loFila.Cells("NO Asiste").Value = False
            loFila.Cells("Tardanza").Value = False
            loFila.Cells("Justificado").Value = False
        End Sub
    End Class

    P.D.
    Inserta varios nombres y haz click en los checkbox

    Un saludo desde Bilbo
    Carlos

    miércoles, 18 de noviembre de 2015 9:25
  • Muchas gracias Carlos ! He probado con este metodo y funciona bien. Me has sido de gran ayuda...

    Saludos !!

    miércoles, 18 de noviembre de 2015 11:01
  • Gracias Javier, voy a probar con tu ayuda. Saludos !
    miércoles, 18 de noviembre de 2015 11:01
  • Gracias ! Ya logre que funcione. Saludos !!
    miércoles, 18 de noviembre de 2015 11:02