none
Problema al recorrer un DataGridView con un campo CheckBox RRS feed

  • Pregunta

  • Hola gente como estan? les consulto estoy teniendo un problema con un campo Checkbox en un DataGridView.

    La cosa es que yo tengo un DataGridView que tiene un campo Checkbox que al cargar los datos de SQL ya aparece tildado.

    Luego cuando necesito yo recorro todas las filas y pregunto si el valor del campo seleccionar (que es de tipo CheckBox) es True o False.

    Mi problema empieza cuando yo destildo el checkbox y luego lo vuelvo a tildar me devuelve el valor "" y no del tipo Boolean y por ende me arroja el error {"La conversión de la cadena """" en el tipo 'Boolean' no es válida."}. Pero si dejo por defecto tildado (sin que yo intervenga) me devuelve correctamente el valor True del campo ese.

    Este es mi codigo por las dudas si sirve

    Esto es cuando cargo el DataGridView con los datos que necesito

        Sub cargarPaquetes()
            Dim i As Integer = Me.DgVistaPaquetes.Rows.Count
            Dim row As DataRow
            For Each row In objPaquete.getUltimo().Rows
                Me.DgVistaPaquetes.Rows.Add("", CStr(row("codigoPaquete")), CStr(row("alto")), CStr(row("largo")), CStr(row("ancho")), CStr(row("nivelFragilidad")), CStr(row("peso")))
                Me.DgVistaPaquetes.Rows(i).Cells(7).Value = True
            Next row
        End Sub

    Y este es el codigo cuando recorro el DataGridView y pregunto por el campo seleccionar (del tipo Checkbox)

            For Each row As DataGridViewRow In Me.DgVistaPaquetes.Rows

                Dim cellSelecion As DataGridViewCheckBoxCell = TryCast(row.Cells("seleccionar"), DataGridViewCheckBoxCell)
                If CBool(cellSelecion.Value) = True Then
                    objPaquete.eliminarUno(row.Cells("codigoPaquete").Value)
                End If

            Next

    si me podrian ayudar les agradeceria!!

    • Cambiado Enrique M. Montejo domingo, 29 de octubre de 2017 11:28 Pregunta relacionada con controles de Windows Forms.
    miércoles, 25 de octubre de 2017 16:07

Todas las respuestas

  • Hola Nico, he tratado de recrear el error y a mi al menos no me da, coloco un msgbox que me devuelava el valor de la celda y lo efectúa bien, tildando y destildando. Me pregunto como generas la columna en cuestión, en diseño? El error te lo da en esa línea justamente? o tienes un try catch para recojer el mensaje, si fuera así podrías quitar ese try y ver exactamente en que línea da el error.

    Saludos

    miércoles, 25 de octubre de 2017 19:00
  • Hola Marcelo, si la columna la hago en tiempo de diseño del DataGridView te paso las propiedades que tiene la columna capaz eso le esta afectando.

    FlatStyle Standard

    HeaderText Seleccionar

    ToolTipText ------

    Visible True

    ContextMenuStrip (ninguno)

    ReadOnly False

    Resizable False

    SortMode NotSorteable

    ThreeState False

    DataPropertyName (ninguno)

    FalseValue -----

    IndeterminateValue ----

    TrueValue -----

    (Name) seleccionar

    AutoSizeMode NotSet

    ColumnType DataGridViewCheckBoxColumn

    DividerWidth 0

    FillWeight 90,56007

    Frozen False

    MinimunWidth 5

    Width 75

    le agregue ---- a los atributos que estan vacios

    te adjuntaria la imagen pero no me deja por ser usuario nuevo y no me apareció el correo para confirmar la cuenta.

    Desde ya muchas gracias por responder

    miércoles, 25 de octubre de 2017 22:19
  • Pues no veo nada raro, para mi no debería ser el error la confirmación de check, te marca en esa línea el error verdad? Para confirmar solamente, quieta eventualmente esta parte

    objPaquete.eliminarUno(row.Cells("codigoPaquete").Value)

    y coloca  MsgBox(cellSelecion.Value.ToString)

    Te debería dar el valor del check

    jueves, 26 de octubre de 2017 0:10
  • el problema si viene del check parece porque el MsgBox(cellSelecion.ToString)  me esta trayendo bien la posicion del campo seleccionar de la tabla que es del Checkbox pero al utilizar el comando MsgBox(cellSelecion.Value.ToString) al destildar y tildar nuevamente me trae un string vacio "", la verdad me parece recontra raro que pase eso, cualquier cosa voy a hacer de nuevo el datagridview capaz estoy definiendo mal un atributo o algo asi.
    jueves, 26 de octubre de 2017 16:02
  • Debe habér algo más que no estamos considerando, podrías colocar el código completo?
    jueves, 26 de octubre de 2017 16:27
  • Imports CapaEntidades
    Imports CapaNegocios

    Public Class AVMPaquetes
        Public estado As Char 'estado es una variable para saber si quiero hacer un Alta, Baja o Modificacion
        Public usuario As String 'para saber que tipo de usuario esta ingresando al sistema
        Dim objPaquete As nPaquete = New nPaquete 'LLamo a las funciones para trabajar con Paquetes
        Dim paquete As ePaquete = New ePaquete 'Instancio un paquete para trabjar con los atributos

    Esta parte es para poder mover el formulario 

        Dim formPosition As Point
        Dim mouseAction As Boolean
        Private Sub Login_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
            If estado = "v" Then
                formPosition = New Point(Cursor.Position.X - Location.X, Cursor.Position.Y - Location.Y)
                mouseAction = True
            End If
        End Sub
        Private Sub Login_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
            If estado = "v" Then
                If mouseAction = True Then
                    Location = New Point(Cursor.Position.X - formPosition.X, Cursor.Position.Y - formPosition.Y)
                End If
            End If
        End Sub
        Private Sub Login_MouseUp(sender As Object, e As MouseEventArgs) Handles MyBase.MouseUp
            If estado = "v" Then
                mouseAction = False
            End If
        End Sub

    Validacion para que ingrese solo texto

        Private Sub TxbAlto_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxbLargo.KeyPress, TxbAncho.KeyPress, TxbAlto.KeyPress
            Dim alto As String
            Dim validaciones As Validaciones = New Validaciones

            alto = TxbAlto.Text
            validaciones.ValidarNumero(alto, e)
        End Sub

    Validacion para que ingrese el precio

        Private Sub TxbPeso_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxbPeso.KeyPress
            Dim validaciones As Validaciones = New Validaciones
            validaciones.ValidarPrecios(e, sender)
        End Sub

    Aca me trae de Base de datos el ultimo paquete insertado para no tener que cargar de nuevo todo el DataGrid

        Sub cargarPaquetes()
            Dim i As Integer = Me.DgVistaPaquetes.Rows.Count
            Dim row As DataRow
            For Each row In objPaquete.getUltimo().Rows
                Me.DgVistaPaquetes.Rows.Add("", CStr(row("codigoPaquete")), CStr(row("alto")), CStr(row("largo")), CStr(row("ancho")), CStr(row("nivelFragilidad")), CStr(row("peso")))
                Me.DgVistaPaquetes.Rows(i).Cells(7).Value = True

            Next row
        End Sub

    De esta manera modifico los datos cargados en BD de los atributos del paquete

        Sub modificarPaquete(ByVal codigoPaquete As Integer)
            Dim row As DataRow
            For Each row In objPaquete.getOne(codigoPaquete).Rows
                TxbCodigoPaquete.Text = CStr(row("codigoPaquete"))
                TxbAlto.Text = CStr(row("alto"))
                TxbLargo.Text = CStr(row("largo"))
                TxbAncho.Text = CStr(row("ancho"))
                CbNivelFragilidad.Text = CStr(row("nivelFragilidad"))
                TxbPeso.Text = CStr(row("peso"))
                TxbObservaciones.Text = CStr(row("observaciones"))
            Next row
        End Sub

    Aca lo que hago es que al ir al formulario anterior no se me limpien los campos del Datagrid ni los de los texbox

        Private Sub BtnAtras_Click(sender As Object, e As EventArgs) Handles BtnAtras.Click

            LbAlertaAlto.Visible = False
            LbAlertaLargo.Visible = False
            LbAlertaAncho.Visible = False
            LbAlertaPeso.Visible = False
            VistaClientes.usuario = usuario
            VistaClientes.estado = "e"
            VistaClientes.Show()
            Me.Close()
        End Sub

    Al apretar el boton cancelar lo que me hace es eliminarme todos los paquetes cargados ya que no se cancela la operacion y me elimina las alertas por si se cargo mal un campo

        Private Sub BtnCancelar_Click(sender As Object, e As EventArgs) Handles BtnCancelar.Click
            objPaquete.eliminar()
            LbAlertaAlto.Visible = False
            LbAlertaLargo.Visible = False
            LbAlertaAncho.Visible = False
            LbAlertaPeso.Visible = False
            Me.Close()

        End Sub

    El boton guardar me lleva al siguiente formulario para seguir con otra operacion

        Private Sub BtnGuardar_Click(sender As Object, e As EventArgs) Handles BtnRegistrar.Click
            Me.Hide()
            RegistrarEnvio.usuario = usuario
                RegistrarEnvio.Show()

        End Sub

    Al cargar el formulario va a preguntar si estoy queriendo hacer un alta o si quiero ver los detalles del paquete, ya que utilizo el mismo formulario para dar de alta y para ver los detalles de cada paquete

        Private Sub AltaPaquetes_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Select Case estado
                Case "a"
                    LbTitulo.Visible = True
                    LbTitulo3.Visible = False
                    LbCancelar.Visible = True
                    BtnCancelar.Visible = True
                    LbAtras.Visible = True
                    BtnAtras.Visible = True
                    LbRegistrar.Visible = True
                    BtnRegistrar.Visible = True
                    LbSalir.Visible = False
                    BtnSalir.Visible = False
                    CbNivelFragilidad.Text = "Muy Alto"
                    cargarPaquetes()
                Case "v"
                    LbTitulo.Visible = False
                    LbTitulo3.Visible = True
                    TxbAlto.Enabled = False
                    TxbAncho.Enabled = False
                    TxbLargo.Enabled = False
                    CbNivelFragilidad.Enabled = False
                    TxbPeso.Enabled = False
                    TxbObservaciones.Enabled = False
                    LbCancelar.Visible = False
                    BtnCancelar.Visible = False
                    LbAtras.Visible = False
                    BtnAtras.Visible = False
                    LbRegistrar.Visible = False
                    BtnRegistrar.Visible = False
                    LbSalir.Visible = True
                    BtnSalir.Visible = True
                    BtnAñadirProducto.Visible = False
                    LbAñadir.Visible = False
                    DgVistaPaquetes.Visible = False
                    Me.Height = 415
                    LbSalir.Location = New Point(439, 374)
                    BtnSalir.Location = New Point(486, 374)
                    Me.BackColor = Color.FromArgb(47, 79, 79)
            End Select
            CbNivelFragilidad.Text = "1 - Muy Alto"
        End Sub

    Cierro el formulario y solo esta visible esta opcion si se estan viendo los detalles del paquete, en el caso del alta de paquetes no se puede oprimir este boton

        Private Sub BtnSalir_Click(sender As Object, e As EventArgs) Handles BtnSalir.Click
            Me.Close()
        End Sub

    Hago validaciones al momento de añadir un paquete para corroborar que todos los datos están ingresados correctamente, en el caso que la comprobación sea correcta entonces se va a hacer el alta del paquete y se va a cargar el DataGridView con el nuevo paquete insertado

        Private Sub BtnAñadirPaquete_Click(sender As Object, e As EventArgs) Handles BtnAñadirProducto.Click
            Dim validacion As Validaciones = New Validaciones
            Dim alto As String
            Dim largo As String
            Dim ancho As String
            Dim nivelFragilidad As String
            Dim peso As String
            Dim Comprobacion As Boolean
            alto = TxbAlto.Text
            largo = TxbLargo.Text
            ancho = TxbAncho.Text
            nivelFragilidad = CbNivelFragilidad.Text
            peso = TxbPeso.Text
            If validacion.ValidarTextoVacio(alto) = False Then
                LbAlertaAlto.Visible = True
            Else
                LbAlertaAlto.Visible = False
            End If
            If validacion.ValidarTextoVacio(largo) = False Then
                LbAlertaLargo.Visible = True
            Else
                LbAlertaLargo.Visible = False
            End If
            If validacion.ValidarTextoVacio(ancho) = False Then
                LbAlertaAncho.Visible = True
            Else
                LbAlertaAncho.Visible = False
            End If
            If validacion.ValidarTextoVacio(peso) Then
                LbAlertaPeso.Visible = False
            Else
                LbAlertaPeso.Visible = True
            End If
            Comprobacion = validacion.ValidarTextoVacio(alto) And validacion.ValidarTextoVacio(largo) And validacion.ValidarTextoVacio(ancho) And validacion.ValidarTextoVacio(peso)
            If Comprobacion Then
                With paquete
                    If LbAñadir.Text = "Modificar paquete" Then
                        .codigoPaquete = CInt(TxbCodigoPaquete.Text)
                    End If
                    .altoPaquete = CInt(alto)
                    .largoPaquete = CInt(largo)
                    .anchoPaquete = CInt(ancho)
                    .nivelfragilidadPaquete = CStr(nivelFragilidad)
                    .pesoPaquete = CDec(peso)
                    .observacionesPaquete = (TxbObservaciones.Text)
                End With
                TxbAlto.Text = ""
                TxbAncho.Text = ""
                TxbLargo.Text = ""
                CbNivelFragilidad.Text = "Muy Alto"
                TxbPeso.Text = ""
                TxbObservaciones.Text = ""
                LbAlertaAlto.Visible = False
                LbAlertaAncho.Visible = False
                LbAlertaLargo.Visible = False
                LbAlertaPeso.Visible = False
                If LbAñadir.Text = "Modificar paquete" Then
                    objPaquete.modificar(paquete)
                    LbAñadir.Text = "Añadir paquete"
                Else
                    objPaquete.agregar(paquete)
                    BtnRegistrar.Enabled = True
                End If
                cargarPaquetes()
            End If

        End Sub

    yo tengo en el DataGridView en el primer campo un Botton que si es oprimido puedo modificar los datos del paquete 

        Private Sub DgVistaPaquetes_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DgVistaPaquetes.CellContentClick
            Dim codigoPaquete As Integer = Me.DgVistaPaquetes.Rows(e.RowIndex).Cells(1).Value
            Select Case e.ColumnIndex
                Case 0
                    LbAñadir.Text = "Modificar paquete"
                    modificarPaquete(codigoPaquete)
            End Select
        End Sub

    aca es donde estoy teniendo el problema, que es el caso de eliminar un paquete en el caso que desee y ahi inserte el código que me pasaste el campo seleccionar se encuentra en la columna 7

        Private Sub BtnEliminar_Click(sender As Object, e As EventArgs) Handles BtnEliminar.Click
            For Each row As DataGridViewRow In Me.DgVistaPaquetes.Rows
                Dim cellSelecion As DataGridViewCheckBoxCell = TryCast(row.Cells("seleccionar"), DataGridViewCheckBoxCell)
                MsgBox(cellSelecion.ToString)
                MsgBox(cellSelecion.Value.ToString)
            Next
            Me.DgVistaPaquetes.Rows.Clear()
            For Each row In objPaquete.getAll().Rows
                Me.DgVistaPaquetes.Rows.Add("", CStr(row("codigoPaquete")), CStr(row("alto")), CStr(row("largo")), CStr(row("ancho")), CStr(row("nivelFragilidad")), CStr(row("peso")))
            Next row
        End Sub
    End Class
    jueves, 26 de octubre de 2017 19:29
  • Encontre un error pero no se si tenga que ver, pues aún no puedo replicar lo de los check, el integer "i" toma el valor Count debe ser -1  DgVistaPaquetes.Rows.Count -1. Sigo viendo

    Saludos

    jueves, 26 de octubre de 2017 22:48
  • Otra cosa, colocas dentro del for each Me.DgVistaPaquetes.Rows(i).Cells(7).Value = True, debo entender que deseas todos los check tildados, para eso debes agregar i +=1, sino solo tildará el primer check varias veces, de ser que solo quieres el primero deja esa línea fuera del for each

    jueves, 26 de octubre de 2017 23:13
  • No esa parte me esta tomando bien porque lo que hago es cargar de a uno el datagridview, entonces solo necesito que me tilde el ultimo paquete que agrego, lo que si tengo de mas es la sentencia for each porque no necesito que esa instruccion sea repetitiva
    domingo, 29 de octubre de 2017 19:43
  • A ok, entonces si es probable que sea el conteo de rows -1 , has verificado eso? porque si está mal itinedado te mandará a un rown vacío
    domingo, 29 de octubre de 2017 19:47
  • Ahi lo "arregle" por asi decirlo, tuve que crear un nuevo datagridview nomas y borre el anterior, se ve que toque alguna propiedad y la cague, pero muchisimas gracias por el aguante capo.

    Si hay alguna forma de darte puntos por tratar de solucionar el problema conmigo decime nomas y te doy puntos! un abrazo grande

    domingo, 29 de octubre de 2017 20:42
  • No hay problema amigo si lo arreglaste feliz por ti

    Saludos

    domingo, 29 de octubre de 2017 20:56