Principales respuestas
Pasarle un DataRow de un foreach a un DataTable

Pregunta
-
Que tal.
Necesito un poco de su valioso conocimiento, les agradeceria me ayudaran.
La situacion es que necesito necesito llenar un Datatable2 a partir de los datos que tenga el Datatable1.
No puedo "clonar" los DataTable porque antes de pasar la fila del DataTable1 al DataTable2 necesito hacer una validacion, si se cumple, paso la fila. de lo contrario, continuo con el foreach.
Quiero hacer algo como esto:
foreach (DataRow fila in DataTable1.Rows) { if (valor1 == valor2) {
//DataTable.ImportRows(fila) -->ERROR: "Referencia a objeto no establecida como instancia de un objeto." DataTable2.Rows.Add(fila);//--> ERROR: "Referencia... bla bla bla" } }
Llevo con esto tres dias y aun no encuentro la manera. Espero puedan ayudarme. De antemano mil gracias. =)
- Editado Darian Ramos jueves, 11 de abril de 2013 23:22
Respuestas
-
no puedes ahcer un Add de la fila directamente
foreach (DataRow fila in DataTable1.Rows) { if (valor1 == valor2) { DataRow row = DataTable2.NewRow(); row["col1"] = fila["col1"].ToString(); row["col2"] = fila["col2"].ToString(); DataTable2.Rows.Add(row); } }
debes crear la nueva fila
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina
- Editado Leandro TuttiniMVP viernes, 12 de abril de 2013 1:31 se modifico el codigo
- Marcado como respuesta Darian Ramos viernes, 12 de abril de 2013 18:58
-
Esta es otra opción parecida a la que te dió leandro.
DataTable dt1 = ObtenerDatos(); DataTable dt2 = dt1.Clone(); foreach (DataRow r1 in dt1.Rows) { if(r1["colCriterio"]==ValorCriterio) { DataRow r2 = dt2.NewRow(); for (int i = 0; i < r2.ItemArray.Length; i++) r2[i] = r1[i]; dt2.Rows.Add(r2); } }
- Marcado como respuesta Darian Ramos viernes, 12 de abril de 2013 18:58
Todas las respuestas
-
no puedes ahcer un Add de la fila directamente
foreach (DataRow fila in DataTable1.Rows) { if (valor1 == valor2) { DataRow row = DataTable2.NewRow(); row["col1"] = fila["col1"].ToString(); row["col2"] = fila["col2"].ToString(); DataTable2.Rows.Add(row); } }
debes crear la nueva fila
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina
- Editado Leandro TuttiniMVP viernes, 12 de abril de 2013 1:31 se modifico el codigo
- Marcado como respuesta Darian Ramos viernes, 12 de abril de 2013 18:58
-
Que tal Leandro mil gracias por tu ayuda.
Disculpa, me equivoque en una linea del codigo que menciono arriba, lo que queria expresar es esto:
foreach (DataRow fila in DataTable1.Rows) { if (valor1 == valor2) { DataTable2.Rows.Add(fila); } }
Tu codigo quedaría asi?:
foreach (DataRow fila in DataTable1.Rows) { if (valor1 == valor2) { DataRow row = DataTable2.NewRow(); row["col1"] = fila["col1"].ToString(); row["col2"] = fila["col2"].ToString(); DataTable2.Rows.Add(fila); } }
-
Esta es otra opción parecida a la que te dió leandro.
DataTable dt1 = ObtenerDatos(); DataTable dt2 = dt1.Clone(); foreach (DataRow r1 in dt1.Rows) { if(r1["colCriterio"]==ValorCriterio) { DataRow r2 = dt2.NewRow(); for (int i = 0; i < r2.ItemArray.Length; i++) r2[i] = r1[i]; dt2.Rows.Add(r2); } }
- Marcado como respuesta Darian Ramos viernes, 12 de abril de 2013 18:58
-
-
Hola otra vez Leandro...
Me sigue saliendo el mismo error aun siguiendo tu ejemplo.
En la linea final marca el error:
DataTable2.Rows.Add(fila)//ERROR: Referencia a objeto no establecida como instancia de un objeto.
A que crees que se deba?... si gustas publico el codigo completo para tener un panorama mas amplio...
-
-
Hola otra vez Leandro...
Me sigue saliendo el mismo error aun siguiendo tu ejemplo.
En la linea final marca el error:
DataTable2.Rows.Add(fila)//ERROR: Referencia a objeto no establecida como instancia de un objeto.
A que crees que se deba?... si gustas publico el codigo completo para tener un panorama mas amplio...
debería se:
DataTable2.Rows.Add(Row);
-
-
Que tal AntiWork.
No pude responderte ayer porque hubo un apagon de corriente y me quede sin PC.
El ejemplo que me diste al parecer funciona, pero cada vez que le paso el row al DataTable2 el DataTable se "vacía" e inserta el row, es decir, todo el tiempo tengo un solo row en el datatable... Talvez lo esté implementando mal.
-------------------------- Solucionado
Logre hacer lo que necesitaba. El "error" estaba en que cada vez que llenaba el dt1, lo clonaba en el dt2, pero el llenado de dt1 estaba dentro de un foreach, es decir, cada vez que llenaba el dt1 "reseteaba" el dt2 y por eso me mostraba solo una fila. Solucione esto creando las columnas desde el principio del metodo (lejos de los foreach), evitando asi el dt2=dt1.Clone().
private void btn_Click(object sender, EventArgs e) { dtCuatro.Columns.Add("columna1"); dtCuatro.Columns.Add("columna2"); dtUno = metodos.ReporteExistencias("", "").Tables[0];//lleno el dt1 con datos de la tabla productos foreach (DataRow filaExistencia in dtUno.Rows) { int existencia = Convert.ToInt32(filaExistencia[5]);//extraigo la existencia if (existencia != 0)//solo me interesan los productos con existencia != 0 { int idProductoParaTraerLote = Convert.ToInt32(filaExistencia[0]); dtDos = metodos.LoteReporte(idProductoParaTraerLote).Tables[0];//lleno el dt2 con los lotes de cada uno de los productos if (dtDos.Rows.Count > 1)// { foreach (DataRow filaLotes in dtDos.Rows) { int idProdParaTraerUbicacion=Convert.ToInt32(filaLotes[1]);//Extraigo el Id del producto string loteParaTraerUbicacion=Convert.ToString(filaLotes[3]);//Extraigo el lote del producto dtTres = metodos.ReporteLocationProd(idProdParaTraerUbicacion, loteParaTraerUbicacion).Tables[0];//lleno el dt3 con la ubicacion de cada lote //dtCuatro = dtTres.Clone();//<--AQUI SE "RESETEABA" mi DataTable.
foreach (DataRow filaUbicaciones in dtTres.Rows) { int IdUbicacionDelCombo=Convert.ToInt32(cbUbicacion.Text);//Extraigo el texto de un Combobox, por ahora lo tengo estatico int IdUbicacionDeLaFila=Convert.ToInt32(filaUbicaciones[2]);//Extraigo el Id de la ubicacion del dt if (IdUbicacionDeLaFila == IdUbicacionDelCombo)//realizo la comparacion de los IdUbicaciones si(IdDelDT == IdDelCombo) { DataRow r2 = dtCuatro.NewRow();//AntiWork for (int i = 0; i < r2.ItemArray.Length; i++)//AntiWork r2[i] = filaUbicaciones[i];//AntiWork dtCuatro.Rows.Add(r2); //AntiWork } } } } } } dgv1.DataSource = dtCuatro;//muestro las ubicaciones que sean igual a la ubicacion seleccionada del combo }
Los metodos los llamo en diferentes DataTables porque estoy trabajando con OperERP.
Muchisimas gracias por su ayuda, AntiWork y Leandro... saludos
- Editado Darian Ramos viernes, 12 de abril de 2013 19:50