none
dataTable convertir los valores devueltos como checkbox del datagridview RRS feed

  • Pregunta

  • Hola de nuevo con las molestias tengo un problema hago una consulta a la bd y si me recupera todos los valores en si o no como string uso firebird 2.5 por lo tanto no puedo manejarlos con boolean  los recupero en otro formulario y pongo el dtg.datasource = tabla  mi porblema surge que los valores true o false no tienen que mostrarse como texto si no como DatagridviewCheckBoxColumn y los que digan true los marque. La primera columna no se toca ya que es dónde tiene la fila del nombre, no se me ocurre alguna idea que pueda hacer para solucionarlo ya intenté varias cosas. tenía creado un Datagridview por defecto con eso pero al remplazarlos me genera basura. y si lo limpio se pierden esos valores. Muchas gracias y espero haberme explicado

                For Each row As DataRow In tabla.Rows
                    For Each column As DataColumn In tabla.Columns

                        If (tabla.Columns.IndexOf(column) >= 1) Then

                            If (row(column).Equals("si")) Then
                                row(column) = "True"
                            Else
                                row(column) = "False"
                            End If
                        End If

                    Next

                Next


    Chama Doble Sistemas

    • Editado Chamavv sábado, 12 de agosto de 2017 4:15
    sábado, 12 de agosto de 2017 4:14

Respuestas

  • Hola Chamavv, no te funcionó la respuesta de la consluta anteriór?

    Saludos

    • Marcado como respuesta Chamavv domingo, 13 de agosto de 2017 0:15
    sábado, 12 de agosto de 2017 4:24
  • Hay varias formas de resolver este caso, una de ellas puede ser clonando la estructura del objeto de tipo DataTable para luego traspasar los datos convirtiendo el valor según el tipo modificado (de String a Boolean), o haciendo la conversión del valor al tiempo en que se recupera las filas, esta forma me parece la más adecuada porque no cargas de procesos adicionales, de hecho vamos por lo mismo que hace "por detrás" el método Fill() que entiendo es el que ocupas para rellenar el DataTable.

    - Contener los datos en un objeto de tipo DataTable (lo mismo puedes hacer con una clase)

    Dim dt As New DataTable
    'Agregar columnas con los nombres y tipos adecuados
    dt.Columns.Add("Nombre", GetType(String))
    dt.Columns.Add("ColName1", GetType(Boolean))
    dt.Columns.Add("ColName2", GetType(Boolean))
    
    'Instanciar la clase FbConnection y FbCommand
    Using cn As New FbConnection("Cadena de conexión")
    	Dim Command As New FbCommand()
    	'...Crear y configurar los miembros de la instancia FBCommand
    
    	cn.Open()
    	Dim reader = Command.ExecuteReader()
    
    	While (reader.Read())
    		Dim nRow = dt.NewRow
                    'Recuperar los valores y realizar las conversiones
    		nRow("Nombre") = reader("Nombre").ToString()
    		nRow("ColName1") = reader("ColName1").ToString() = "Si"
    		nRow("ColName2") = reader("ColName2").ToString() = "Si"
    
    		dt.Rows.Add(nRow)
    	End While
    	reader.Close()
    
    	'Enlazar los datos a la grilla
    	DataGridView1.DataSource = dt
    End Using


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Chamavv domingo, 13 de agosto de 2017 0:12
    sábado, 12 de agosto de 2017 5:46

Todas las respuestas

  • Hola Chamavv, no te funcionó la respuesta de la consluta anteriór?

    Saludos

    • Marcado como respuesta Chamavv domingo, 13 de agosto de 2017 0:15
    sábado, 12 de agosto de 2017 4:24
  • Hay varias formas de resolver este caso, una de ellas puede ser clonando la estructura del objeto de tipo DataTable para luego traspasar los datos convirtiendo el valor según el tipo modificado (de String a Boolean), o haciendo la conversión del valor al tiempo en que se recupera las filas, esta forma me parece la más adecuada porque no cargas de procesos adicionales, de hecho vamos por lo mismo que hace "por detrás" el método Fill() que entiendo es el que ocupas para rellenar el DataTable.

    - Contener los datos en un objeto de tipo DataTable (lo mismo puedes hacer con una clase)

    Dim dt As New DataTable
    'Agregar columnas con los nombres y tipos adecuados
    dt.Columns.Add("Nombre", GetType(String))
    dt.Columns.Add("ColName1", GetType(Boolean))
    dt.Columns.Add("ColName2", GetType(Boolean))
    
    'Instanciar la clase FbConnection y FbCommand
    Using cn As New FbConnection("Cadena de conexión")
    	Dim Command As New FbCommand()
    	'...Crear y configurar los miembros de la instancia FBCommand
    
    	cn.Open()
    	Dim reader = Command.ExecuteReader()
    
    	While (reader.Read())
    		Dim nRow = dt.NewRow
                    'Recuperar los valores y realizar las conversiones
    		nRow("Nombre") = reader("Nombre").ToString()
    		nRow("ColName1") = reader("ColName1").ToString() = "Si"
    		nRow("ColName2") = reader("ColName2").ToString() = "Si"
    
    		dt.Rows.Add(nRow)
    	End While
    	reader.Close()
    
    	'Enlazar los datos a la grilla
    	DataGridView1.DataSource = dt
    End Using


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Chamavv domingo, 13 de agosto de 2017 0:12
    sábado, 12 de agosto de 2017 5:46
  • Para este problema de "Si" , "No" puedes filtrar la Tabla antes de usarla en el DataqGridView

     For i As Integer = 0 To Tabla.Rows.Count - 1
                For a As Integer = 1 To Tabla.Columns.Count - 1
                    If Convert.ToString(Tabla.Rows.Item(i).Item(a)) = "Si" Then
                        Tabla.Rows.Item(i).Item(a) = "True"
                    ElseIf Convert.ToString(Tabla.Rows.Item(i).Item(a)) = "No" Then
                        Tabla.Rows.Item(i).Item(a) = "False"
                    End If
                Next
            Next
        
            Tabla.AcceptChanges()

    despues sigues con el código

    Saludos



    • Editado Marcelo PF sábado, 12 de agosto de 2017 5:50
    sábado, 12 de agosto de 2017 5:49
  • Para este problema de "Si" , "No" puedes filtrar la Tabla antes de usarla en el DataqGridView

     For i As Integer = 0 To Tabla.Rows.Count - 1
                For a As Integer = 1 To Tabla.Columns.Count - 1
                    If Convert.ToString(Tabla.Rows.Item(i).Item(a)) = "Si" Then
                        Tabla.Rows.Item(i).Item(a) = "True"
                    ElseIf Convert.ToString(Tabla.Rows.Item(i).Item(a)) = "No" Then
                        Tabla.Rows.Item(i).Item(a) = "False"
                    End If
                Next
            Next
        
            Tabla.AcceptChanges()

    despues sigues con el código

    Saludos



    Amigo muchas gracias, pero  ya pasaba el valor como true o false, pero es muy buena solución :D

    Jesús Sandoval

    domingo, 13 de agosto de 2017 0:11
  • Muchas gracias amigo tuve otra solución pero es muy buena te la voy a marcar cómo válida :D

    Jesús Sandoval

    domingo, 13 de agosto de 2017 0:12
  • si amigo lo publiqué hice algunas modificaciones pero tu código me solucionó el problema, abrí el tema gracias, espero veas que ahora si te estoy dando la votación y la respuesta :D

    Jesús Sandoval

    domingo, 13 de agosto de 2017 0:13
  • Hola Chamavv, no te funcionó la respuesta de la consluta anteriór?

    Saludos

    esde tu base de datos llega True y False ok, para ese caso debemos preparar de ante mano las columnas del DataGridview en el Form. Esto seria parar el formato de las columnas al  Dgv1 del form2

       For i As Integer = 0 To Tabla.Columns.Count - 1
                Select Case i
                    Case 0
                        Dim TxT As New DataGridViewTextBoxColumn
                        TxT.Name = Tabla.Columns.Item(i).ColumnName
                        TxT.HeaderText = Tabla.Columns.Item(i).Caption
                        Form2.Dgv1.Columns.Add(TxT)
                    Case Else
                        Dim ChK As New DataGridViewCheckBoxColumn
                        ChK.Name = Tabla.Columns.Item(i).ColumnName
                        ChK.HeaderText = Tabla.Columns.Item(i).Caption
                        Form2.Dgv1.Columns.Add(ChK)
                End Select
    
            Next

    como ves ulitizo un Select Case para clasificar cual columna es o no un Chek y cual un Text, echo esto le pasamos los valores de los Rows

     For Each row As DataRow In Tabla.Rows
                Form2.Dgv1.Rows.Add(row.ItemArray)
            Next


    Jesús Sandoval

    domingo, 13 de agosto de 2017 0:15
  • No necesitas hacer todos esos "ajustes" si el origen de datos ya contiene los datos en los tipos que requieres, en el ejemplo adjunto se convierte el valor 'Si' y 'No' por el correspondiente valor booleano -en una columna de tipo Boolean-, esto es suficiente para que el enlace genere una columna de tipo 'DataGridViewCheckBoxColumn'.


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    domingo, 13 de agosto de 2017 1:40
  • Hola Wiliams, el ejemplo que dio Cahmavv es que le volvían los datos tipo String "Si" "No", para el caso la columna CheckBoxColumn no toma ese valor como booleano, eso lo he comprobado, ahora que si lo que dices es que vuelve un argumendo booleano desde la base de datos es otra cosa, "True" , "False" si lo toma como argumento

    Saludos


    • Editado Marcelo PF domingo, 13 de agosto de 2017 2:09
    domingo, 13 de agosto de 2017 1:54
  • Amigo  Firebird 2.5 no existen valores booleanos eso lo especifiqué en el cuerpo del mensaje. Eso lo hice en otros navegadores pero ya un miembro de la comunidad me entendió mi problema y lo solucioné :D  gracias igualmente

    Jesús Sandoval

    domingo, 13 de agosto de 2017 3:26
  • Exacto amigo  marcelo PF eso lo mencioné en la parte de arriba que la base de datos en Firebird 2.5 no maneja booleano y el si o no es para posteriormente mostrarlo en un reporte, lo convierto en true o false pero por alguna razón no me lo mostraba en el datagridview como booleano, siempre comparto las soluciones cuando un miembro me ayuda o llego a la solución para eso estamos aquí para aprender gracias a todos en éste caso doy gracias a Marcelo PF por la solución que me funcionó a la primera:D

    Jesús Sandoval


    • Editado Chamavv domingo, 13 de agosto de 2017 3:30
    domingo, 13 de agosto de 2017 3:29
  • Lamento que no se haya entendido lo que intenté mencionar ni tampoco la propuesta ofrecida.

    Entiendo perfectamente que hasta la versión 3 de Firebird no se contaba con el tipo de dato Boolean y por lo mismo el OP decidió almacenar los valores 'Si' y 'No' como cadena de caracteres. También entiendo perfectamente que siendo -la columna que contiene los valores Si o No- de tipo String no iba a generar una columna de tipo 'DataGridViewCheckBoxColumn' al tiempo de enlazar la grilla con los datos y en consecuencia no se iba a mostrar las casillas de verificación. En ese sentido la propuesta iba orientada a crear una instancia de tipo DataTable agregando columnas con el tipo adecuado para obtener el resultado que se espera:

    Dim dt As New DataTable
    'Agregar columnas con los nombres y tipos adecuados
    dt.Columns.Add("Nombre", GetType(String))
    dt.Columns.Add("ColName1", GetType(Boolean))
    dt.Columns.Add("ColName2", GetType(Boolean))

    La segunda parte trataba de convertir los valores 'Si' y 'No' a su correspondiente valor booleano, esto al mismo tiempo en que se recuperan las filas de la base de datos:

    'Recuperar los valores y realizar las conversiones
    nRow("Nombre") = reader("Nombre").ToString()
    nRow("ColName1") = reader("ColName1").ToString() = "Si" 'Convertir el valor a True o False
    nRow("ColName2") = reader("ColName2").ToString() = "Si" 'Convertirá el valor a True o False


    Finalmente, teniendo listo el origen de los datos con las columnas necesarias y los tipos adecuados lo único que resta es enlazar los datos a la grilla, el mapping se encargará de crear las columnas con los tipos adecuados, de hecho entiendo es como intentaste hacerlo inicialmente, es la manera adecuada y no mediante el método Add().

    'Enlazar los datos a la grilla
    DataGridView1.DataSource = dt



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    domingo, 13 de agosto de 2017 18:42