none
PROBLEMA PARA CARGAR DATAGRIDVIEW RRS feed

  • Pregunta

  • Buenos días

    Estoy intentando cargar un datagridview desde una tabla de SQL de manera manual por que hay campos del DaTaGridView que tienen que ser ComboBox para poder modificar la opción y al final agregar un boton el realize en un Update. 

    El problema que estoy teniendo es que no se como hacer para cargar de manera manual.

    la consulta que hago a la BD es la siguiente:

    query = "select Apellidos, Nombres, Dni, Jerarquia,Cargo, Chapa, Uurr, DestinoActual, Funcion  FROM TbRollC";

    Dicho DataGridView sería algo así mas un botón al final el cual pondré un Update para las modificaciones realizadas.

    El datagridview tiene las mismas columnas con nombres en mayuscula.

    De ellos son DataGridViewComboBox JERARQUIA, UURR, DESTINOACTUAL, FUNCION.

    No encuentro la forma de solucionarlo. 

    Muchas gracias

    Saludos

    Nicolás

    lunes, 11 de junio de 2018 15:24

Todas las respuestas

  • No sé exactamente qué sería cargar el DGV de forma manual, pero le puedo dar una solución con vinculación a datos usando colecciones de objetos.

    No sé la estructura de su base de datos, pero imagino que que Jerarquia, Uurr, DestinoActual y Funcion son claves foráneas y que por lo tanto tiene tablas para cada uno de estos campos.

    Haré el ejemplo solamente con uno de estos campos.  Los demás sería lo mismo.

    Imaginaré que la tabla Jerarquía tiene Id y Nombre, y que Id es el valor que se encuentra en TbRollC, campo Jerarquia.

    Necesita una clase entidad que represente una Jerarquía.

    public class Jerarquia
    {
        public long Id { get; set; }
        public string Nombre { get; set; }
    }

    También necesita una que represente los registros en TbRollC.

    public class RollC
    {
        public string Apellidos { get; set; }
        public string Nombres { get; set; }
        public string Dni { get; set; }
        public long IdJerarquia { get; set; }
        public string Cargo { get; set; }
        public string Chapa { get; set; }
        public long IdUurr { get; set; }
        public long IdDestinoActual { get; set; }
        public long IdFuncion { get; set; }
    }

    Normalmente estas aplicaciones se programan en capas.  Normalmente tendríamos un repositorio de datos que devuelve listas de objetos de estas clases.  Normalmente se programan algo así:

    public class JerarquiaRepositorio
    {
        public List<Jerarquia> ObtenerTodas()
        {
            List<Jerarquia> resultados = new List<Jerarquia>();
            //Asumo SQL Server.
            using (SqlConnection conn = new SqlConnection("<cadena de conexión>"))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("Select * From TbJerarquia", conn))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Jerarquia j = new Jerarquia()
                            {
                                Id = (long)reader["Id"],
                                Nombre = reader["Nombre"].ToString()
                            };
                            resultados.Add(j);
                        }
                    }
                }
            }
            return resultados;
        }
    }

    El que devuelve objetos RollC sería básicamente lo mismo.  Lo que cambia es la consulta SQL y el tipo de objeto contenido en la lista devuelta.

    Entonces ya tenemos representaciones de los registros y forma de obtenerlas.

    Lo primero que hay que hacer es preparar los comboboxes del DGV o de lo contrario la vinculación a datos dará errores.  Luego se vincula la grilla a los datos de TbRollC.

    En el evento Load del fomulario o un evento igualmente apropiado, cargamos de los repositorios los objetos que necesitamos y vinculamos a datos.  Yo estoy haciendo el ejemplo con Jerarquia solamente así que eso es lo que muestro a continuación.

    private void Form1_Load(object sender, EventArgs e)
    {
        JerarquiaRepositorio jRep = new JerarquiaRepositorio();
        DataGridViewComboBoxColumn c = dgv1.Columns["Jerarquia"] as DataGridViewComboBoxColumn;
        c.DataSource = jRep.ObtenerTodos();
        c.DisplayMember = nameof(Jerarquia.Nombre);
        c.ValueMember = nameof(Jerarquia.Id);
    
        //Listo con el combobox.  Ahora vinculamos a datos.
        RollCRepositorio rollCRep = new RollCRepositorio();
        dgv1.DataSource = rollCRep.ObtenerTodos(); //U otro método por el estilo.
    }


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    martes, 12 de junio de 2018 0:34
    Moderador
  • Hola este es el código que tengo desarrollado:

    La consulta es "Select * from TbRollC"

                string consulta, apellido, nombre, dni, jerarquia; ;
                DataTable dt = new DataTable();
    
                DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
                btn.HeaderText = "Guardar";
                dtgv.Columns.Add(btn);
                dt.Columns.Add("APELLIDOS", typeof(string));
                dt.Columns.Add("NOMBRES", typeof(string));
                dt.Columns.Add("DNI", typeof(string));
                dtgv.DataSource = dt;
    
                // Cmb JERARQUIA
                DataGridViewComboBoxColumn JERARQUIA = new DataGridViewComboBoxColumn();
                JERARQUIA.HeaderText = "JERARQUIA";
                dtgv.Columns.Add(JERARQUIA);
                consulta = "Select * from \"TbJerarquia\"";
                JERARQUIA.DataSource = cargarDt(consulta);
                JERARQUIA.DisplayMember = "Jerarquia";
                try
                {
                    NpgsqlCommand cmd = new NpgsqlCommand(query, conn);
                    NpgsqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        apellido = dr["Apellidos"].ToString();
                        nombre = dr["Nombres"].ToString();
                        dni = dr["DNI"].ToString();
                        jerarquia = dr["Jerarquia"].ToString();
    
                        dt.Rows.Add(apellido, nombre, dni);
                    } dr.Close();
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ERROR EN ClaseBD.LlenarGridRaro: " + ex.Message);
                }

    Muchas gracias

    Nicolás

     
    miércoles, 13 de junio de 2018 16:08
  • Pues no dice si tiene problemas o no.  Si compara con mi código verá que a la columna de jerarquía se le asignan 3 propiedades y usted solamente asigna 2.

    Si tiene más problemas, debe hacerlo saber de forma explícita.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 13 de junio de 2018 17:57
    Moderador
  • Muchas gracias por la buena predisposición.

    Lo que no puedo hacer es que en la el combo de la grilla al cargarla me aparezca por defecto el valor que tiene dicho campo en la tabla de la bd

    jueves, 14 de junio de 2018 0:40
  • Si lo hace como le mostré, la selección es automática.  Funciona a la perfección.  Siga las instrucciones al pie de la letra y le funcionará.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 14 de junio de 2018 0:42
    Moderador