none
LLENAR DATAGRIDVIEW CON DATOS DE VARIAS TABLAS MYSQL RRS feed

  • Pregunta

  • Buen día,

    Solicito su amable apoyo para saber como llenar un datagridview con datos de varias tablas usando el modelo de capas para el desarrollo en lenguaje C#.

    para la capa de consultas tengo el siguiente metodo "obtenerconsultadoble()" con una consulta a dos tablas:

    "SELECT idclientes, Cliente, Baan, RazonSocial, Almacen, Direccion_a, Ciudad_a from clientes join almacenes WHERE RazonSocial LIKE '%PALABRA"%' AND idclientes=cliente"

    En la capa presentación quiero llenar el datagrid con el metodo de la consulta:

    dataGridView1.DataSource = Persistencia.obtenerconsultadoble();

    Pero el datagrid me muestra las columnas de tres tablas incluidas las dos tablas de la consulta doble:

    Hay algun error en el anterior procedimiento? o existe algun otro procedimiento para agregar este tipo de multiples consultas a un datagridview?

    Agradesco de antemano cualquier concejo o ayuda que me puedan brindar



    • Editado ivgomez lunes, 3 de agosto de 2015 3:49
    lunes, 3 de agosto de 2015 3:46

Respuestas

  • No más bien sería algo así:

    private void Bsc_Almacenes_Load(object sender, EventArgs e)
    {
        dgvClientes.AutoGenerateColumns = false;
        dgvClientes.Columns.Add(new DataGridViewTextBoxColumn()
        {
            Name = "Id_Cliente",
            HeaderText = "Cliente",
            DataPropertyName = "Id_Cliente"
        });
        dgvClientes.Columns.Add(new DataGridViewTextBoxColumn()
        {
            Name = "Baan",
            HeaderText = "Código Baan",
            DataPropertyName = "Baan"
        });
    
        ......
                
    
        dgvClientes.DataSource = Seleccionar.obtenerconsultadoble();
    }
    Aunque el establecer la propiedad AutoGenerateColumns a false y la creación de las columnas también puedes hacerlo desde el diseñador del formulario y así no tendrías que cambiar nada en tu código.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 7 de agosto de 2015 5:53

Todas las respuestas

  • Podrías indicar cual es la estructura de tus tablas Almacen y Clientes?

    Para mi que la consulta que estas haciendo le faltan arreglos

    por ejemplo: cuando haces un join normalmente se usa algo asi

    SELECT idclientes, Cliente, Baan, RazonSocial, Almacen, Direccion_a, Ciudad_a 

    from clientes c 

    join almacenes a

    on c.idcliente=a.idcliente


    • Editado Julia Lan lunes, 3 de agosto de 2015 4:32
    • Marcado como respuesta ivgomez martes, 4 de agosto de 2015 4:05
    • Desmarcado como respuesta ivgomez martes, 4 de agosto de 2015 4:05
    • Marcado como respuesta ivgomez miércoles, 5 de agosto de 2015 3:19
    • Desmarcado como respuesta ivgomez jueves, 6 de agosto de 2015 0:51
    lunes, 3 de agosto de 2015 4:30
  • hola

    - cuando en la query usas el JOIN donde defines el ON para indicar por que tablas se relacionan ?

    o sea partimos de la base que el join esta mal definido

    - el metodo obtenerconsultadoble() que tipo de dato retorna?  es un datatable o es un lista con una clase que tu defines

    >>existe algun otro procedimiento para agregar este tipo de multiples consultas a un datagridview?

    recuerda que tu puedes definir que columnas mostrar en el grid en tiempo de diseño creando las columna

    luego en codigo defines el AutoGenerateColumns = false

    en las columanas es importante indicar el DataPropertyName

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP lunes, 3 de agosto de 2015 11:47
    • Marcado como respuesta ivgomez martes, 4 de agosto de 2015 3:41
    • Desmarcado como respuesta ivgomez martes, 4 de agosto de 2015 3:50
    • Marcado como respuesta ivgomez martes, 4 de agosto de 2015 4:04
    • Desmarcado como respuesta ivgomez martes, 4 de agosto de 2015 4:06
    • Marcado como respuesta ivgomez miércoles, 5 de agosto de 2015 3:19
    • Desmarcado como respuesta ivgomez jueves, 6 de agosto de 2015 0:51
    lunes, 3 de agosto de 2015 11:42
  • Hola Leandro, gracias por responder

    El metodo obtenerconsultadoble() me retorna una lista. Se encuentra definida en una clase llamada "seleccionar". 
    En la clase Cliente estan las variables con los Setters & Getters.

    este es el codigo del metodo:

    //TRAER DATOS DE ALMACENES Y CLIENTES AL DATAGRID
    
            public static List<Cliente> obtenerconsultadoble()
            {
                List<Cliente> _lista3 = new List<Cliente>();
    
                MySqlCommand cmd3 = new MySqlCommand(string.Format("select idclientes, Cliente, Baan, RazonSocial, Almacen, Direccion_a, Ciudad_a from clientes c join almacenes a on c.idclientes=a.Cliente"), Conexion.Abrir());
                MySqlDataReader reader3 = cmd3.ExecuteReader();
                while (reader3.Read())
                {
                    Cliente pCliente3 = new Cliente();
                    pCliente3.Baan = Convert.ToInt32(0);
                    pCliente3.Razon_Social = reader3.GetString(1);
                    pCliente3.Almacen = reader3.GetString(2);
                    pCliente3.Ciudad = reader3.GetString(3);
                    _lista3.Add(pCliente3);
                }
                Conexion.Cerrar();
                return _lista3;
            }

    por ultimo, en la capa presentación tengo un formulario llamado "Bsc_Almacenes" con el datagrid llamado dgvClientes en donde al cargar el formulario traigo los datos de la consulta con el siguiente codigo:

    private void Bsc_Almacenes_Load(object sender, EventArgs e)
            {            
               dgvClientes.DataSource = Seleccionar.obtenerconsultadoble();
            }

    A pesar de que hice las correcciones a la consulta sql sigue mostrando todos los datos de las dos tablas mas otras columnas de otra tabla que no aparece en la consulta.

    Analizando las columnas de toda la consulta, veo que me esta trayendo las variables que he creado en la clase "Cliente", osea la que contiene los Setters & Getters.

    La clase cliente la tengo definida de la siguiente forma

    class Cliente 
        {
            private int id_cliente;
            private int id_almacen;
            private int baan;
            private string razon_social;
            private string almacen;
            private string nit;
            private string direccion;
            private string ciudad;
            private string contacto;
            private int id_user;
            private string nombres;
            private string apellidos;
            private int codigo;
            private int idperfil;
            private string perfil;
            private string correo;
            private string telefono;
            private string celular;
            private string usuario;
            private string contrasena;
    
            public int Id_Cliente
            {
                get { return id_cliente; }
                set { id_cliente = value; }
            }
    
            public int Id_almacen
            {
                get { return id_almacen; }
                set { id_almacen = value; }
            }
    
            public int Baan
            {
                get { return baan; }
                set { baan = value; }
            }
    
            public string Razon_Social
            {
                get { return razon_social; }
                set { razon_social = value; }
            }
    
            public string Almacen
            {
                get { return almacen; }
                set { almacen = value; }
            }
    
            public string Nit
            {
                get { return nit; }
                set { nit = value; }
            }
    
            public string Direccion
            {
                get { return direccion; }
                set { direccion = value; }
            }
    
            public string Ciudad
            {
                get { return ciudad; }
                set { ciudad = value; }
            }
    
            public string Contacto
            {
                get { return contacto; }
                set { contacto = value; }
            }
    
            public int Id_user
            {
                get { return id_user; }
                set { id_user = value; }
            }
    
            public string Nombres
            {
                get { return nombres; }
                set { nombres = value; }
            }
    
            public string Apellidos
            {
                get { return apellidos; }
                set { apellidos = value; }
            }
    
            public int Codigo
            {
                get { return codigo; }
                set { codigo = value; }
            }
    
            public int Idperfil
            {
                get { return idperfil; }
                set { idperfil = value; }
            }
    
            public string Perfil
            {
                get { return perfil; }
                set { perfil = value; }
            }
    
            public string Correo
            {
                get { return correo; }
                set { correo = value; }
            }
    
            public string Telefono
            {
                get { return telefono; }
                set { telefono = value; }
            }
    
            public string Celular
            {
                get { return celular; }
                set { celular = value; }
            }
    
            public string Usuario
            {
                get { return usuario; }
                set { usuario = value; }
            }
    
            public string Contrasena
            {
                get { return contrasena; }
                set { contrasena = value; }
            }
    
        }

    Muchas gracias



    • Editado ivgomez martes, 4 de agosto de 2015 3:57
    martes, 4 de agosto de 2015 3:41
  • Hola Julia, gracias por responder,

    la estructura es la siguiente:

    CREATE TABLE IF NOT EXISTS `laboratorio`.`clientes` (
      `idclientes` INT NOT NULL AUTO_INCREMENT COMMENT '',
      `Baan` INT NOT NULL COMMENT '',
      `RazonSocial` VARCHAR(45) NOT NULL COMMENT '',
      `Nit` VARCHAR(45) NOT NULL COMMENT '',
      `Ciudad` VARCHAR(45) NOT NULL COMMENT '',
      `Direccion` VARCHAR(80) NOT NULL COMMENT '',
      `Telefono` VARCHAR(45) NULL COMMENT '',
      `Contacto1` VARCHAR(55) NOT NULL COMMENT '',
      `Email1` VARCHAR(55) NOT NULL COMMENT '',
      PRIMARY KEY (`idclientes`)  COMMENT '')
    
    -- -----------------------------------------------------
    -- Table `laboratorio`.`almacenes`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `laboratorio`.`almacenes` (
      `idalmacenes` INT NOT NULL AUTO_INCREMENT COMMENT '',
      `Cliente` INT NOT NULL COMMENT '',
      `Almacen` VARCHAR(45) NOT NULL COMMENT '',
      `Ciudad_a` VARCHAR(45) NOT NULL COMMENT '',
      `Direccion_a` VARCHAR(80) NOT NULL COMMENT '',
      `Telefono_a` VARCHAR(45) NOT NULL COMMENT '',
      `Contacto1_a` VARCHAR(45) NOT NULL COMMENT '',
      `Email1_a` VARCHAR(55) NOT NULL COMMENT '',
      PRIMARY KEY (`idalmacenes`)  COMMENT '',
      INDEX `cliente_idx` (`Cliente` ASC)  COMMENT '',
      CONSTRAINT `cliente`
        FOREIGN KEY (`Cliente`)
        REFERENCES `laboratorio`.`clientes` (`idclientes`)
    

    He modificado la consulta como me sugeriste de la siguiente forma:

    select idclientes, Cliente, Baan, RazonSocial, Almacen, Direccion_a, Ciudad_a from clientes c join almacenes a on c.idclientes=a.Cliente

    muchas gracias,

    martes, 4 de agosto de 2015 3:50
  • Por un lado lo que le asignas al DataSouce del DataGridView es una lista de objetos de la clase Cliente por lo que no influye la consulta que utilizas para generar dicha lista.

    El DataGridView tiene una propiedad AutoGenerateColumns que por defecto está a true. Esto va a hacer que te genere una columna por cada propiedad de la clase Cliente al asociarle al DataSource, manteniendo las que puedas haber añadido manualmente.

    Tienes dos opciones:

    1. Dejar el DataGridView vacío (sin columnas) y mantener la propiedad AutoGenerateColumns a true de forma que te generará automáticamente una columna por cada propiedad de la clase Cliente.

    2. Poner la propiedad AutoGenerateColumns a false y crear manualmente las columnas que deseas mostrar. En este caso, en cada columna, deberás indicar el nombre de la propiedad de la clase Cliente que deseas asociar a la columna en la propiedad DataPropertyName de ésta.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 5:42
  • Gracias por la sugerencia Asier, sin embargo hasta ahora estoy aprendiendo a implementar el modelo de capas para la programación en c#.

    me podrias ayudar con un ejemplo corto de como haria para llenar uno de los campos del datagrid?

    entiendo que en el metodo load del formulario mas o menos haria lo siguiente?

    private void Bsc_Almacenes_Load(object sender, EventArgs e)
      {          
        dgvClientes.AutoGenerateColumns = false;
        column.DataPropertyName = "baan";
        baan.DataPropertyName = Seleccionar.obtenercosultadoble(); 
      }
    viernes, 7 de agosto de 2015 4:27
  • No más bien sería algo así:

    private void Bsc_Almacenes_Load(object sender, EventArgs e)
    {
        dgvClientes.AutoGenerateColumns = false;
        dgvClientes.Columns.Add(new DataGridViewTextBoxColumn()
        {
            Name = "Id_Cliente",
            HeaderText = "Cliente",
            DataPropertyName = "Id_Cliente"
        });
        dgvClientes.Columns.Add(new DataGridViewTextBoxColumn()
        {
            Name = "Baan",
            HeaderText = "Código Baan",
            DataPropertyName = "Baan"
        });
    
        ......
                
    
        dgvClientes.DataSource = Seleccionar.obtenerconsultadoble();
    }
    Aunque el establecer la propiedad AutoGenerateColumns a false y la creación de las columnas también puedes hacerlo desde el diseñador del formulario y así no tendrías que cambiar nada en tu código.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 7 de agosto de 2015 5:53