none
Modificar nombre de columnas de Datagridview

    Pregunta

  • Hola amigos nuevamente con las consultas, tengo este tema, quisiera cambiar el nombre de las columnas de una grilla, pero desde una ClaseDAO, ya que por defecto me carga el nombre de las columnas de la tabla de SQL, estaba intentando este codigo pero me muestra error:

    En la ClaseDAO:

    Imports System.Windows.Forms 'ya tiene la referencia agregada

    ...

     Public Sub RenombrarColumns(DataGridView1 As DataGridView)

            DataGridView1.AutoGenerateColumns = False
            DataGridView1.Columns.Clear()

            DataGridView1.Columns(0).Name = "Código"
            DataGridView1.Columns(1).Name = "Razón Social"
            DataGridView1.Columns(2).Name = "RUC"
            DataGridView1.Columns(3).Name = "Dirección"
            DataGridView1.Columns(4).Name = "Distrito"
            DataGridView1.Columns(5).Name = "Teléfono"
            DataGridView1.Columns(6).Name = "Correo Electrónico"
            DataGridView1.Columns(7).Name = "Página Web"
            DataGridView1.Columns(8).Name = "Fecha de registro"
            DataGridView1.Columns(9).Name = "Tipo de cliente"
            DataGridView1.Columns(10).Name = "Foto"
        End Sub

    En el evento LOAD del FRM:

     clienteDAO.RenombrarColumns(dgv_Clientes)

    el error que me muestra es el siguiente:

    Gracias...


    Juan Fernando


    martes, 11 de octubre de 2016 4:47

Respuestas

  • ? y como hago eso?? ahi si no entendi naditititita :(

    gracias


    Juan Fernando

    A ver, tomaré el ejemplo de un hilo anterior:

    Private Sub btnMostrarDatos_Click(sender As Object, ...
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    			Dim ConsultaSQL As String =
    			"SELECT c.id_cli AS 'Código',c.RazonSocial AS 'Razón social',c.ruc_cli AS 'RUC'," _
    			& "c.dir_cli AS 'Direccion',d.nomb_dist AS 'Distrito',c.telef_cli AS 'Teléfono', " _
    			& "c.correo_cli AS 'Correo Electrónico',c.web_cli AS 'Página web', " _
    			& "c.fec_reg_cli AS 'Fecha de registro', t.descrip_tip_cli AS 'Tipo cliente', " _
    			& "c.Fotografia AS 'Foto' FROM Cliente c" _
    			& "INNER JOIN Distrito d On (c.id_dist = d.id_dist)" _
    			& "INNER JOIN TipoCliente t On (c.id_tip_cli = t.id_tip_cli);"
    
    			Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    			Dim da As New SqlDataAdapter(cmd)
    
    			Dim dt As New DataTable
    
    			da.Fill(dt)
                            'Basta con vincular los datos al origen, nada adicional
    			DataGridView1.DataSource = dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub

    Nota que cada columna ha sido renombrada (alias de columna) por un nombre mas legible, con ello no tienes que renombrar las columnas del objeto de tipo DataGridview ni hacer nada adicional, deja que las columnas se generen según los datos vinculados.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 5:09
  • Juan_fernando,

    Veo que omití un caracter de espacio entre el alias 'c' e INNER JOIN, reemplaza la consulta por lo siguiente:

    Dim ConsultaSQL As String =
    	"SELECT c.id_cli AS 'Código',c.RazonSocial AS 'Razón social',c.ruc_cli AS 'RUC'," _
    	& "c.dir_cli AS 'Direccion',d.nomb_dist AS 'Distrito',c.telef_cli AS 'Teléfono'," _
    	& "c.correo_cli AS 'Correo Electrónico',c.web_cli AS 'Página web'," _
    	& "c.fec_reg_cli AS 'Fecha de registro', t.descrip_tip_cli AS 'Tipo cliente'," _
    	& "c.Fotografia AS 'Foto' FROM Cliente c " _
    	& "INNER JOIN Distrito d On (c.id_dist = d.id_dist) " _
    	& "INNER JOIN TipoCliente t On (c.id_tip_cli = t.id_tip_cli)"

    Por otro lado, el procedimiento no debería tener un parámetro de tipo 'DataGridView', no debes mezclar un proyecto de biblioteca de clases con controles de UI.

    Try
    	dgv_Clientes.DataSource = clienteDAO.ConsultaClientes()
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try	


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 6:18

Todas las respuestas

  • JuanfernandoDj,

    No te compliques innecesariamente, puedes renombrar las columnas que defines en la lista de selección según consideres adecuado:

    "SELECT ClieNombre AS 'Nombre cliente', (Cantidad * PUnit) AS 'Precio total',..."

    Lo que sugiero es que crees un alias en cada columna que será el nombre que pintará en cada encabezado de la grilla de datos.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 4:54
  • ? y como hago eso?? ahi si no entendi naditititita :(

    gracias


    Juan Fernando

    martes, 11 de octubre de 2016 4:58
  • ? y como hago eso?? ahi si no entendi naditititita :(

    gracias


    Juan Fernando

    A ver, tomaré el ejemplo de un hilo anterior:

    Private Sub btnMostrarDatos_Click(sender As Object, ...
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    			Dim ConsultaSQL As String =
    			"SELECT c.id_cli AS 'Código',c.RazonSocial AS 'Razón social',c.ruc_cli AS 'RUC'," _
    			& "c.dir_cli AS 'Direccion',d.nomb_dist AS 'Distrito',c.telef_cli AS 'Teléfono', " _
    			& "c.correo_cli AS 'Correo Electrónico',c.web_cli AS 'Página web', " _
    			& "c.fec_reg_cli AS 'Fecha de registro', t.descrip_tip_cli AS 'Tipo cliente', " _
    			& "c.Fotografia AS 'Foto' FROM Cliente c" _
    			& "INNER JOIN Distrito d On (c.id_dist = d.id_dist)" _
    			& "INNER JOIN TipoCliente t On (c.id_tip_cli = t.id_tip_cli);"
    
    			Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    			Dim da As New SqlDataAdapter(cmd)
    
    			Dim dt As New DataTable
    
    			da.Fill(dt)
                            'Basta con vincular los datos al origen, nada adicional
    			DataGridView1.DataSource = dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub

    Nota que cada columna ha sido renombrada (alias de columna) por un nombre mas legible, con ello no tienes que renombrar las columnas del objeto de tipo DataGridview ni hacer nada adicional, deja que las columnas se generen según los datos vinculados.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 5:09
  • Ah ok si te viendo el ejemplo si llegue a entender a lo que refieres, el caso es que en mi consulta tengo un query con Inner Join, como reemplazaria eso ya que tiene una funcion especifica (mostrar los nombres de algunos campos mas no los Id de los FK), en mi consulta tengo esto:

    el el DAO

     Public Function ConsultaClientes()
            Try
                cn.Open()
                With cmd
                    .CommandType = CommandType.Text
                    .CommandText = "SELECT c.id_cli, c.RazonSocial, c.ruc_cli, c.dir_cli, d.nomb_dist, c.telef_cli, c.correo_cli, c.web_cli, c.fec_reg_cli, t.descrip_tip_cli, c.Fotografia FROM Cliente c INNER JOIN Distrito d ON (c.id_dist = d.id_dist) INNER JOIN TipoCliente t ON (c.id_tip_cli = t.id_tip_cli);"
                    .Connection = cn
                End With
                With da
                    .SelectCommand = cmd
                    dt = New DataTable
                    .Fill(dt)
                End With
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                cn.Close()
            End Try
            Return dt
        End Function

    gracias.


    Juan Fernando


    martes, 11 de octubre de 2016 5:18
  • Juan_fernando,

    ¿Viste el aporte anterior?. Es la misma consulta que tienes a la que renombre las columnas, bastará con que copies a tu procedimiento para que lo pruebes.

    CONSIDERACIONES RESPECTO AL PROCEDIMIENTO QUE ADJUNTAS:

    1. Un procedimiento Function retorna un valor de un tipo, acostumbra a definir el tipo de retorno caso contrario -por omisión- se retornará un tipo 'Object'. Public Function ConsultaClientes() As DataTable.
    2. Utiliza la instrucción Using para enmarcar una instancia de la clase SqlConnection tal como te muestro en el ejemplo, al parecer trabajas con conexiones de ámbito global, no es correcto.
    3. La capa DAO que se entiende es un proyecto de biblioteca de clases, ¿lanza una ventana de mensaje (MessageBox)?. Omite el control de errores Try...Catch, captura las excepciones en la UI.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 5:34
  • hice las modificaciones de la sgte manera:

    el la clase:

       Public Function ConsultaClientes(dgv As DataGridView) As DataTable
            Try
                Using cn As New SqlConnection("Server=(local);DataBase=ProyectoFinalVs01;user='sa';pwd='123'")
                    Dim ConsultaSQL As String =
                    "SELECT c.id_cli AS 'Código',c.RazonSocial AS 'Razón social',c.ruc_cli AS 'RUC'," _
                    & "c.dir_cli AS 'Direccion',d.nomb_dist AS 'Distrito',c.telef_cli AS 'Teléfono', " _
                    & "c.correo_cli AS 'Correo Electrónico',c.web_cli AS 'Página web', " _
                    & "c.fec_reg_cli AS 'Fecha de registro', t.descrip_tip_cli AS 'Tipo cliente', " _
                    & "c.Fotografia AS 'Foto' FROM Cliente c" _
                    & "INNER JOIN Distrito d On (c.id_dist = d.id_dist)" _
                    & "INNER JOIN TipoCliente t On (c.id_tip_cli = t.id_tip_cli);"

                    Dim cmd As New SqlCommand(ConsultaSQL, cn)

                    Dim da As New SqlDataAdapter(cmd)

                    Dim dt As New DataTable

                    da.Fill(dt)
                    dgv.DataSource = dt
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        End Function

    en el load del frm

                clienteDAO.ConsultaClientes(dgv_Clientes)

     

    al ejecutar me muestra este mensaje


    Juan Fernando


    martes, 11 de octubre de 2016 5:56
  • Juan_fernando,

    Veo que omití un caracter de espacio entre el alias 'c' e INNER JOIN, reemplaza la consulta por lo siguiente:

    Dim ConsultaSQL As String =
    	"SELECT c.id_cli AS 'Código',c.RazonSocial AS 'Razón social',c.ruc_cli AS 'RUC'," _
    	& "c.dir_cli AS 'Direccion',d.nomb_dist AS 'Distrito',c.telef_cli AS 'Teléfono'," _
    	& "c.correo_cli AS 'Correo Electrónico',c.web_cli AS 'Página web'," _
    	& "c.fec_reg_cli AS 'Fecha de registro', t.descrip_tip_cli AS 'Tipo cliente'," _
    	& "c.Fotografia AS 'Foto' FROM Cliente c " _
    	& "INNER JOIN Distrito d On (c.id_dist = d.id_dist) " _
    	& "INNER JOIN TipoCliente t On (c.id_tip_cli = t.id_tip_cli)"

    Por otro lado, el procedimiento no debería tener un parámetro de tipo 'DataGridView', no debes mezclar un proyecto de biblioteca de clases con controles de UI.

    Try
    	dgv_Clientes.DataSource = clienteDAO.ConsultaClientes()
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try	


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 11 de octubre de 2016 6:18
  • Muchas gracias...cerrado

    Juan Fernando

    martes, 11 de octubre de 2016 7:11