Principales respuestas
agregar filas a datagridview con datasource

Pregunta
-
Hola.
Paso parte de codigo donde tengo un DatagridView que se llena por datasource. Quiero agregar a ese dgv nuevas filas donde se daran de alta nuevos registros, leyendo un poco encontré ideas y quedó algo asi. El tema es que me da error (1)"Referencia a objeto no establecida como instancia de un objeto" (marcado en negrita). Que me está faltando? se puede hacer esto?
Gracias
dgv_materiales.DataSource = mat.ListarMateriales(); //funcion que llena el dgv
DataTable dt = new DataTable();
dt = dgv_materiales.DataSource as DataTable;
DataRow dr = dt.NewRow(); (1)
dt.Rows.Add();
dgv_materiales.DataSource = dt;
GigiK
Respuestas
-
-
Fíjate que la fila vacía no puede estar vacía "del todo" porque la columna en la que hay un combo forzosamente tiene que contener uno de los valores del combo. Asegúrate de que al hacer el "new" le pones en esa columna un valor que sea válido para el ValueMember. Por ejemplo, si quieres que el combo tome por defecto el primer valor y dicho valor resulta tener el Codigo 1, y la columna se llama UniMed, entonces la fila nueva podría ser así:
list.Add(new Material {UniMed=1});
Pero pon el valor y la columna correctos para tu programa, el 1 y el UniMed me los he inventado yo.
- Marcado como respuesta NatiPK viernes, 28 de febrero de 2020 19:11
Todas las respuestas
-
Casi seguro que el problema está en que dgv_materiales.DataSource no devuelve un DataTable. Tendrías que poner un punto de ruptura en el debugger y examinar qué es lo que en realidad te está devolviendo, posiblemente un DataView o algo por el estilo. Da igual que al llenarlo le asignes un DataTable; al leerlo te devuelve lo que use por dentro, no lo que le asignaste.
Al no devolver un DataTable, la expresión dgv_materiales.DataSource as DataTable devuelve null, y entonces cuando accedes a dt.Rows da el error de "referencia no establecida" porque dt es null.
- Propuesto como respuesta Diana AcuñaModerator martes, 25 de febrero de 2020 17:25
-
-
Lo primero tienes que usar el debugger para averiguar lo que mencionábamos en la respuesta anterior (qué tipo de dato te esta devolviendo el DataSource). Una vez que tengamos esa información, entonces a la vista de la misma podremos saber que es lo que se necesitaría cambiar en el código.
-
Pero entonces cual seria el error acá?
que me falta en el código que agregué a la consulta?
GigiK
hola
No conviertas un datagridview a datatable, utiliza directamente el metodo (que imagino) que es objeto datatable..
dt = mat.ListarMateriales();
suerte
-
Te paso el método que llena el datagridview, que por lo que lei si utilizo List no puedo convertir en datatable.
public List<Material> ListarMateriales()
{
var bd = new ModeloConstructora();
List<Material> listMat = new List<Material>();
var mate = from m in bd.Materiales
where m is Material
select m as Material;
foreach(Material mat in mate)
{
listMat.Add(mat);
}
return listMat;
}
Alguna solución para esto?
La idea de convertirlo en datatable es para poder agregar nuevas filas para ingresar nuevos datos a la tabla en la base de datos sin tener que usar textbox y botones para agregar, la idea es que se haga todo desde el datagridview.
Gracias
GigiK
-
No, no puedes convertir un List en DataTable así por las buenas. Se puede hacer con un bucle y usando System.Reflection, pero requiere un par de docenas de líneas de código.
Pero no es necesario. Puedes vincular el List al DataSource del DGV (como ya lo tienes). Y cuando quieras añadir una fila, simplemente la añades en el List que ya tenías (usando el método Add del List), y vuelves a asignar el mismo List (ahora con una fila más) al DataSource.
-
-
-
-
Alberto me sirvio esto que me dijiste, pero tengo en ese DGV una columna que es combobox y al agregar la nueva fila me faltaria agregar esa columna, alguna solucion para esto?
te paso como lleno esa columna
//acá lleno el dgv
this.dgv_materiales.AutoGenerateColumns = false;
this.dgv_materiales.DataSource = Mate.ListarMateriales();
//y acá lleno el combobox.
DataGridViewComboBoxColumn columnaunimed = this.dgv_materiales.Columns["UnidadMedida"] as DataGridViewComboBoxColumn;
columnaunimed.DisplayMember = "UniMed_Descripcion";
columnaunimed.ValueMember = "UniMed_Codigo";
columnaunimed.DataSource = um.ListarUnidadesMedida();agregué un boton que agrega esa nueva fila y el cual contiene
List<Material> list = Mate.ListarMateriales();
list.Add(new Material());
dgv_materiales.DataSource = list;pero al hacer esto me da error "El valor de DataGridViewComboBoxcell no es válido.
GigiK
-
Fíjate que la fila vacía no puede estar vacía "del todo" porque la columna en la que hay un combo forzosamente tiene que contener uno de los valores del combo. Asegúrate de que al hacer el "new" le pones en esa columna un valor que sea válido para el ValueMember. Por ejemplo, si quieres que el combo tome por defecto el primer valor y dicho valor resulta tener el Codigo 1, y la columna se llama UniMed, entonces la fila nueva podría ser así:
list.Add(new Material {UniMed=1});
Pero pon el valor y la columna correctos para tu programa, el 1 y el UniMed me los he inventado yo.
- Marcado como respuesta NatiPK viernes, 28 de febrero de 2020 19:11
-