locked
MArcar un solo checkbox en un datagridview RRS feed

  • Pregunta

  • Hola a todos.

    Tengo un datagridview el cual tiene una columna con checkbox. El problema es que preciso que solo se pueda marcar uno y emitir un mensaje que afecta a la fila donde está ese checkbox, pero solo se puede marcar uno cada vez. Entonces he estado mirando por google, foros, etc. y no encuentro la solución. Creo que se tiene que utilizar el evento: Cell_click pero nada, no me funciona. No detecta la row ni nada.

     Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            Select Case e.ColumnIndex
                Case 1 'Columna que tiene el checkbox
                    Dim Celda As DataGridViewCheckBoxCell = CType(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell)
                    Dim CE As CheckState = CType(Celda.Value, CheckState)
                    If CE = CheckState.Checked Then
                        Celda.Value = CheckState.Unchecked
                    Else
                        Celda.Value = CheckState.Checked
                        MessageBox.Show("Fila 8")
                    End If
            End Select
        End Sub

    Os agradecería que me indicarais como puedo realizar esto. Es decir, marcar un solo checkbox y mostrar el mensaje.

    Un saludo.

    Gemma

    domingo, 28 de abril de 2013 15:04

Respuestas

  • ...realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila....
      Sub dataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
        If DataGridView1.CurrentCell.ColumnIndex = 0 Then
          If DataGridView1.IsCurrentCellDirty Then
            DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
            For Each fila As DataGridViewRow In DataGridView1.Rows
              If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then
                fila.Cells(0).Value = False
              End If
            Next
            MsgBox("Fila actual: " & DataGridView1.CurrentCell.RowIndex.ToString)
          End If
        End If
      End Sub
    Recuerda que el nº de fila es en base 0 -cero-


    "Option Strict On" no es opcional, es necesario.

    • Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 18:14
    domingo, 28 de abril de 2013 17:21
  • pero si usa el CellClick no obtines el mism efecto y sin checkbox ?

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 16:44
    domingo, 28 de abril de 2013 16:38

Todas las respuestas

  • hola

    deberias usar el evento CellValidating con este determinas  cuando el estado de un checkbox cambio

    en realidad determinas cuando se quiere realizar un cambio y este puede ser aplicado, entonces ala lanzarse el evento validarias si hay algun otro chekc marcado previamente

    podrias usar

    Dim hayMarcado As Boolean = DataGridView1.Rows.Cast(Of DataGridViewRow).Any(Function(x) Convert.ToBoolean(x.Cells("nombrecolcheckbox").Value))

    If hayMarcado Then

       //aqui anulas la accion mediante el e.Handler = True del validating

    End If

    con eso no permites que se marque otro checkbox

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Sergio Parra domingo, 28 de abril de 2013 15:21
    domingo, 28 de abril de 2013 15:16
  • Hola Leandro:

    No me aclaro con este tema, realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila. No se que tengo que poner después de la instrucción If hayMarcado then.

    Lo siento, no acabo de saber que tengo que hacer.

    De cualquier manera y como siempre, muchas gracias.

    Un cordial saludo.

    Gemma

    domingo, 28 de abril de 2013 15:32
  • pero si necesitas uno marcado para que suas un checkbox, porque simplemente no seleccionas el row resaltando la seleccion

    esto ya lo provee el propio datagridview y es automatico, no necesitas hacer nada especial

    un check refleja seleccion multiple

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 28 de abril de 2013 15:46
  • Hola:

    Es un form que proviene de vb6 para la valoración de empresas y ahí me funcionaba perfectamente con el vsflexgrid. Es para que el usuario obtenga una información de las fórmulas utilizadas en esa línea, es por eso que preciso que el usuario sepa que cuando pulse en el checkbox obtendrá esa información. Te adjunto la imagen de como lo tengo, el picará en el checkbox y se le desplegarán unas labels con la información referente a ese análisis.

    domingo, 28 de abril de 2013 16:01
  • pero si usa el CellClick no obtines el mism efecto y sin checkbox ?

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 16:44
    domingo, 28 de abril de 2013 16:38
  • Hola Leandro:

    Si, lo voy ha hacer con el cellclick y voy a sacar esa columna, da demasiados problemas. Cuando pulse la línea ya le saldrá la información de la misma en la parte de debajo de la grilla.

    Lo dejo como tu dices, era mas por una cuestión de estética y porque algunos usuarios a los que irá el nuevo programa estaban ya acostumbrados al checkbox.

    Muchas gracias como siempre por tu ayuda.

    Un fuerte abrazo.

    Gemma

    domingo, 28 de abril de 2013 16:44
  • Lo dejo como tu dices, era mas por una cuestión de estética y porque algunos usuarios a los que irá el nuevo programa estaban ya acostumbrados al checkbox.

    el tema mas que nada lo planteaba porque si usabas el evento CellValuChanged debias descmarcar el check que ya tenias marcado y esto volveria a lanzar el evento lo cual afectaria al check que estas marcando, o sea seria un ida y vuelta de eventos que causaria bastante problemas

    si era solo validar como comente al principio es bien directo, pero ir anulando opciones anteriores se complcia un poco y si con una simple seleccion con el CellClick se obtiene el mismo efecto creo que es mas sano ir por ese camino

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 28 de abril de 2013 16:50
  • Si, Leandro ya lo estoy montando de esa manera.

    Menos historias y menos problemas.

    Gracias querido amigo.

    Gemma.

    domingo, 28 de abril de 2013 17:10
  • ...realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila....
      Sub dataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
        If DataGridView1.CurrentCell.ColumnIndex = 0 Then
          If DataGridView1.IsCurrentCellDirty Then
            DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
            For Each fila As DataGridViewRow In DataGridView1.Rows
              If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then
                fila.Cells(0).Value = False
              End If
            Next
            MsgBox("Fila actual: " & DataGridView1.CurrentCell.RowIndex.ToString)
          End If
        End If
      End Sub
    Recuerda que el nº de fila es en base 0 -cero-


    "Option Strict On" no es opcional, es necesario.

    • Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 18:14
    domingo, 28 de abril de 2013 17:21
  • Hola Carlos:

    Gracias pro preocuparte por esto, te estoy muy agradecida.

    Va "casi" perfecto, efectivamente me muestra la línea que era lo más importante, te digo el "casi" porque no se como desmarcar el checkbox anterior que estaba marcado, es decir, que al tomar el "foco" el nuevo checkbox, automáticamente el anterior se desmarcara, por lo demás va perfecto. Si supieras solo como poder hacer eso, tendría el tema totalmente solucionado, porque efectivamente ya puedo mostrar mensajes cuando el usuario marque la línea a través del checkbox.

    Muy agradecida por tu interés y efectividad.

    Un cordial saludo.

    Gemma.

    domingo, 28 de abril de 2013 18:14
  • Hola Carlos:

    Perdón por el "casi", es que va perfecto, había cambiado el index de la columna solamente en ColumnIndex= 0 y tenía que ser 1, y también lo tenía que haber cambiado en  fila.Cells(0).Value = False, ya le he puesto el 1 y ahora si, efectivamente se destilda el anterior. Va como una seda.

    Muchas gracias otra vez.

    Gemma

    domingo, 28 de abril de 2013 18:24
  • ok, perfecto entonces!

    "Option Strict On" no es opcional, es necesario.

    domingo, 28 de abril de 2013 18:48
  • Tal ves sea algo tarde pero realice esto y me funciono que es similar a lo que se menciona pero introduje una linea extra antes del for

     

     Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

            'esta parte me permite seleccionar solo un checkbox y se elimina el anterior 

            DataGridView1.Rows(e.RowIndex).Cells(1).Value = Not DataGridView1.Rows(e.RowIndex).Cells(1).Value
            For Each fila As DataGridViewRow In DataGridView1.Rows
                If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then
                    fila.Cells(1).Value = False
                End If
            Next

        
        End Sub

    jueves, 4 de julio de 2013 5:44
  • Les paso un código que realiza lo que necesitan, deben de tener una grilla con al menos dos columnas: NroDocumento y Opcion que será la que tenga el checkbox.

     Private Sub dgv_Listado_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgv_Listado.CellMouseClick
            Control_Seleccion()
        End Sub

        Private Sub Control_Seleccion()
            Try
                    Dim rowIndex As Integer = dgv_Listado.CurrentCell.RowIndex
                    'Dim columnIndex As Integer = dgv_Listado.CurrentCell.ColumnIndex
                    Dim enumerator As IEnumerator
                    Dim str As String = Convert.ToString(Me.dgv_Listado.Item("NroDocumento", rowIndex).Value)
                    Try
                        enumerator = DirectCast(Me.dgv_Listado.Rows, IEnumerable).GetEnumerator
                        Do While enumerator.MoveNext
                            Dim current As DataGridViewRow = DirectCast(enumerator.Current, DataGridViewRow)
                            If str <> current.Cells.Item("NroDocumento").Value.ToString.Trim Then
                                current.Cells.Item("Opcion").Value = False
                            End If
                        Loop
                    Finally
                        If TypeOf enumerator Is IDisposable Then
                            TryCast(enumerator, IDisposable).Dispose()
                        End If
                    End Try
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try
        End Sub

    martes, 4 de marzo de 2014 17:27