none
Llenar algunos campos en DataGridView con MySql y C# RRS feed

  • Pregunta

  • Saludos.
    Necesito la ayuda para lo siguiente:
    Necesito mostrar en un DataGridView algunos campos de mi tabla empleado, especificamente: nombre, apepat, apemat, area y cargo.

    Mando aquí el siguiente código:
    Metodo para agregar las columnas manualmente
     private void agrega_columnas()
            {
                //CREO LAS COLUMNAS MEDIANTE CODIGO
                dataGridView1.Columns.Add("cod", "Codigo");
                dataGridView1.Columns["cod"].Width = 50;
                dataGridView1.Columns.Add("nombre", "Nombre");
                dataGridView1.Columns["nombre"].Width = 100;
                dataGridView1.Columns.Add("appat", "Ape Pat");
                dataGridView1.Columns["appat"].Width = 100;
                dataGridView1.Columns.Add("apmat", "Ape Mat");
                dataGridView1.Columns["apmat"].Width = 100;
                dataGridView1.Columns.Add("area", "area");
                dataGridView1.Columns["area"].Width = 80;
                dataGridView1.Columns.Add("cargo", "cargo");
                dataGridView1.Columns["cargo"].Width = 80;
               nfilas = 0;
    }
    
    Dentro del CellMouseClick del DataGridView para que se inserte todos los empleados de la BD

     private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
             
                int i;
                for (i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    DataRow fila;
                    // fila = tabemp.NewRow();
                    fila = tabemp.Rows[i];
                    dataGridView1.Rows.Add();
                    dataGridView1["cod", nfilas].Value = fila["cod"];
                    dataGridView1["nombre", nfilas].Value = fila["nombre"];
                    dataGridView1["appat", nfilas].Value = fila["appat"];
                    dataGridView1["apmat", nfilas].Value = fila["apmat"];
                    dataGridView1["area", nfilas].Value = fila["area"];
                    dataGridView1["cargo", nfilas].Value = fila["cargo"];
                    nfilas++;
                }
              
            }
    


    Y esto dentro del Load

    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("select * from empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);
               dset = new DataSet();
                    tabemp = dset.Tables["empleado"];
                agrega_columnas();
                dataGridView1.DataSource=tabemp;
    

    Mi problema es que sólo me muestro las columnas, más no los registros. ¿Qué puede estar mal?
    Espero pueda ayudarme.

    Gracias.

    miércoles, 30 de noviembre de 2011 7:06

Respuestas

  • hola

    porque no defines las columnas en timepo de diseño ?

    analzia la primer parte del articulo para validar como hacer esto

    [DataGridView] – Parte 4 - Uso del DataGridViewComboBoxColumn

     

    algo que te esta faltando es definir la propeidad "DataPropertyName" de las columans para indicar que campo del origen de datos debe tomar

    y otro punto es que no defines el AutoGenerateColumns en false

     

     

    lo que no entendi es que hace el CellMouseClick, porque recorres las filas del grid y las agregas en el mismo grid

    eso no tiene sentido

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta StevenLlaja jueves, 1 de diciembre de 2011 14:22
    miércoles, 30 de noviembre de 2011 11:59
  •  

    hay algo que no entiendo y que creo que es donde radica tu problema

    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("select * from empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);
               dset = new DataSet();
                    tabemp = dset.Tables["empleado"];
                agrega_columnas();
                dataGridView1.DataSource=tabemp;

    para que creas un dataset "dset" y igualas "tabemp" a la tabla "empleado"

    tabemp = dset.Tables["empleado"];

    si te das cuenta creas un dataset sin tablas

     dset = new DataSet();

    y luego pasas a la tabla tabemp lo que te referi anteriormente, aqui es que esta tu problema el DataTable taemp esta vacio a la hora llenar el datasource del datagridview

    dataGridView1.DataSource=tabemp;

    podrias hacer

    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("select * from empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);

    agrega_columnas(); dataGridView1.DataSource=tabemp;

    pero como te comenta @Leandro por que no defines las columnas en tiempo de diseño, por que se supone que tu tabla empleado no cambiara y si lo hace entonces tendras que ir al codigo a cambiar las columnas en el metodo

    agrega_columnas();

    otra cosa para que haces esto de construir las tablas en el CellMouseClick

    Saludos.


    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"
    miércoles, 30 de noviembre de 2011 12:42
  • Hola Steven,

    No te recomiendo que utilices nunca esa sintaxis, que en este caso es lo mismo que hacerlo con join. Pero la verdad que hace mucho tiempo y no he logrado localizar un link para pasarte el resultado de un join y una where escrito de esta forma puede devolver diferentes resultados.

    Escribe la consulta de esta forma

    SELECT e.appat, e.apmat, e.nombre, a.Nombre AS area, c.Nombre AS cargo
    FROM empleado e, 
    	inner join area a on a.codarea = e.codarea
    	inner join cargo c on c.codcargo = e.codcargo
    


    Aparte piensa en otra cosa imagina que codcargo por ejemplo permite null con lo cual deberías de hacer left join puesto que la consulta que escribiste no devolvería los registros donde el codcargo en la tabla de empleados fuese null.

    Esa sintaxis es bastante vieja, escribe inner join o left join

    Saludos,


    phurtado
    • Marcado como respuesta StevenLlaja jueves, 1 de diciembre de 2011 14:21
    miércoles, 30 de noviembre de 2011 18:57
    Moderador

Todas las respuestas

  • hola

    porque no defines las columnas en timepo de diseño ?

    analzia la primer parte del articulo para validar como hacer esto

    [DataGridView] – Parte 4 - Uso del DataGridViewComboBoxColumn

     

    algo que te esta faltando es definir la propeidad "DataPropertyName" de las columans para indicar que campo del origen de datos debe tomar

    y otro punto es que no defines el AutoGenerateColumns en false

     

     

    lo que no entendi es que hace el CellMouseClick, porque recorres las filas del grid y las agregas en el mismo grid

    eso no tiene sentido

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta StevenLlaja jueves, 1 de diciembre de 2011 14:22
    miércoles, 30 de noviembre de 2011 11:59
  •  

    hay algo que no entiendo y que creo que es donde radica tu problema

    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("select * from empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);
               dset = new DataSet();
                    tabemp = dset.Tables["empleado"];
                agrega_columnas();
                dataGridView1.DataSource=tabemp;

    para que creas un dataset "dset" y igualas "tabemp" a la tabla "empleado"

    tabemp = dset.Tables["empleado"];

    si te das cuenta creas un dataset sin tablas

     dset = new DataSet();

    y luego pasas a la tabla tabemp lo que te referi anteriormente, aqui es que esta tu problema el DataTable taemp esta vacio a la hora llenar el datasource del datagridview

    dataGridView1.DataSource=tabemp;

    podrias hacer

    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("select * from empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);

    agrega_columnas(); dataGridView1.DataSource=tabemp;

    pero como te comenta @Leandro por que no defines las columnas en tiempo de diseño, por que se supone que tu tabla empleado no cambiara y si lo hace entonces tendras que ir al codigo a cambiar las columnas en el metodo

    agrega_columnas();

    otra cosa para que haces esto de construir las tablas en el CellMouseClick

    Saludos.


    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"
    miércoles, 30 de noviembre de 2011 12:42
  • Tienes razón, compañero Luis, lo he hecho como has comentado, pero a excepción de que en la consulta del select he puesto los campos que deseo mostrar, y está de la siguiente manera:

    Load:
    conex = new MySqlConnection();
                conex.ConnectionString = "server=localhost;user id=root;password= ;database=Peru";
                ademp = new MySqlDataAdapter("SELECT nombre,appat,apmat,codarea,codcargo FROM empleado", conex);
                tabemp = new DataTable();
                ademp.Fill(tabemp);       
                 dataGridView1.DataSource=tabemp;
    

    Y dentro del CellMouseClick
      int i=dataGridView1.CurrentRow.Index;
               
                fila = tabemp.Rows[i];
    
                string a, b, c, d, f;
                a = fila["nombre"].ToString();
                b = fila["appat"].ToString();
                c = fila["apmat"].ToString();
                d = fila["codarea"].ToString();
                f = fila["codcargo"].ToString();
                A = a;
                B = b;
                C = c;
                D = d;
                E = f;
                Form1 form1 = new Form1();
                form1.Show();
                this.Close();
    

    En lo que se basa el proyecto que estoy haciendo es que tengo un FormA, en el que debo realizar una busqueda mandandome al FormB donde se encuentro el DGV, al hacer click en una fila, coge todos los valores y me los muestra en el FormA.

    Una pequeña cosilla más, cuando cargo en el DGV, la parte del area y cargo, me aparece el código con el cual está relacionada con el empleado, como podría hacer para que me muestre los nombres.


    Espero que a alguien le sirva este código.

    Saludos.
    miércoles, 30 de noviembre de 2011 16:25
  • Hola,

    Una pequeña cosilla más, cuando cargo en el DGV, la parte del area y cargo, me aparece el código con el cual está relacionada con el empleado, como podría hacer para que me muestre los nombres.

    Imagino que te refieres a que te muestre los nombres del area y cargo, sin ver el nombre de las tablas podrías hacer un join entre la tabla de empleado y las tablas de area  y cargo, te lo voy a mostrar partiendo de que las tablas se llaman "area" y "cargo"

    SELECT empleado.nombre,empleado.appat,empleado.apmat,empleado.codarea,empleado.codcargo,
           area.nombre,cargo.nombre
    FROM empleado
         inner join area on area.codarea = empleado.codarea
         inner join cargo on cargo.codcargo = empleado.codcargo
    


    Te recomiendo que mires este link para que te quede claro como se usa join 

    http://dev.mysql.com/doc/refman/5.0/es/join.html

    Saludos,


    phurtado
    miércoles, 30 de noviembre de 2011 18:10
    Moderador
  • Uff Perdon que hace dos exactamente me movi a comer y ahora fue que regrese

    Como te comenta nuestro compañero (esto me causo risa) @Pedro esta seria la forma para obtener los datos de la info del empleado

     

    Saludos y nos cuentas


    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"
    miércoles, 30 de noviembre de 2011 18:35
  • Hola Luis,

    Que parte te causa risa la join,el compañero o Pedro?

    Saludos,


    phurtado
    miércoles, 30 de noviembre de 2011 18:42
    Moderador
  • Hola Steven,

    No te recomiendo que utilices nunca esa sintaxis, que en este caso es lo mismo que hacerlo con join. Pero la verdad que hace mucho tiempo y no he logrado localizar un link para pasarte el resultado de un join y una where escrito de esta forma puede devolver diferentes resultados.

    Escribe la consulta de esta forma

    SELECT e.appat, e.apmat, e.nombre, a.Nombre AS area, c.Nombre AS cargo
    FROM empleado e, 
    	inner join area a on a.codarea = e.codarea
    	inner join cargo c on c.codcargo = e.codcargo
    


    Aparte piensa en otra cosa imagina que codcargo por ejemplo permite null con lo cual deberías de hacer left join puesto que la consulta que escribiste no devolvería los registros donde el codcargo en la tabla de empleados fuese null.

    Esa sintaxis es bastante vieja, escribe inner join o left join

    Saludos,


    phurtado
    • Marcado como respuesta StevenLlaja jueves, 1 de diciembre de 2011 14:21
    miércoles, 30 de noviembre de 2011 18:57
    Moderador
  • Que pasa pedro lo del "Compañero", si te fijas el dice "Tienes razón, compañero Luis" y yo digo

    "Como te comenta nuestro compañero (esto me causo risa) @Pedro" y luego digo

    "esta seria la forma para obtener los datos de la info del empleado" osea la forma que tu le muestras no join ni Pedro

    y pido disculpas si te sentiste mal por eso, no lo dije por nada

    Saludos


    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"
    miércoles, 30 de noviembre de 2011 19:09
  • Listo está, gracias por su ayuda. Seguiré avanzando con mi proyecto y si me crean más dudas, espero seguir contando con su apoyo.

    Ahora seguiré con lo que es su creación de su cuenta de usuario para ingresar al sistema, creo que mi sufrimiento será con los TreeView que se me vienen.

    Saludos, y nuevamente gracias.
    miércoles, 30 de noviembre de 2011 19:10
  • porque haz anulado la respuesta

    SELECT e.appat, e.apmat, e.nombre, a.Nombre AS area, c.Nombre AS cargo
    FROM empleado e, area a, cargo c
    WHERE e.codarea = a.codarea
    AND e.codcargo = c.codcargo

    esa tambien deberia funcionar al igual que es INNER JOIN

    ambos son validos y deberian funcionar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 30 de noviembre de 2011 19:15
  • Esa la había borrado antes de que los demás escribieran, porqué pensé que el código que había hecho tenía un error, pero el error era en mi código C# para coger los nombres del area y cargo.

    Es decir, me faltaba cambiar esto:

                d = fila["codarea"].ToString();
                f = fila["codcargo"].ToString();
    
    

    Por esto:

                d = fila["area"].ToString();
                f = fila["cargo"].ToString();

    Saludos.
    miércoles, 30 de noviembre de 2011 19:23
  • Hola Leandro,

    Si pero hay veces como he comentado que el resultado no es el mismo y de verdad que me ha pasado y encontré la explicación, lo que ocurre que hace mucho tiempo de esto y no lo encuentro para pasarlo pero era uno de los argumentos por los que SqlServer que no se si lo recuerdas en versiones 6.0 y creo que hasta 2000 soportaba al igual que oracle pero como no, con sintaxis diferente Oracle "+=" y en sqlserver era "*=" para el tema de los join, pero esto con más campos en la where y precedencia en paréntesis, devolvia resultados diferentes, por eso es por lo que se opta por  inner join y left join ,aparte que queda más claro o por lo menos para mí que la otra sintaxis propuesta.

    Mira este link que aun no siendo lo mismo habla sobre el tema.

    http://stackoverflow.com/questions/121631/inner-join-vs-where

    Saludos,


    phurtado
    miércoles, 30 de noviembre de 2011 19:31
    Moderador
  • Esa la había borrado antes de que los demás escribieran, porqué pensé que el código que había hecho tenía un error, pero el error era en mi código C# para coger los nombres del area y cargo.

    Es decir, me faltaba cambiar esto:

                d = fila["codarea"].ToString();
                f = fila["codcargo"].ToString();
    
    

    Por esto:

                d = fila["area"].ToString();
                f = fila["cargo"].ToString();

    Saludos.
    Ahora fue que entendi lo que te dijo @Leandro

    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"
    miércoles, 30 de noviembre de 2011 20:39