Usuario
PROBLEMA PARA CARGAR DATAGRIDVIEW

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
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 -
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
-
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 -
-
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