none
Pasarle un DataRow de un foreach a un DataTable RRS feed

  • 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. =)




    jueves, 11 de abril de 2013 22:16

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
    jueves, 11 de abril de 2013 22:59
  • 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
    jueves, 11 de abril de 2013 23:22

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
    jueves, 11 de abril de 2013 22:59
  • 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);
    	} 
    }

    jueves, 11 de abril de 2013 23:19
  • 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
    jueves, 11 de abril de 2013 23:22
  • si exacto, es de un datatable al otro

    voy a editar la respuesta asi lo arreglo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 23:27

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

    jueves, 11 de abril de 2013 23:44
  • Hola AntiWork, mil gracias por tu ayuda, pruebo tu idea y te comento en un momento... saludos =)

    jueves, 11 de abril de 2013 23:44

  • 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);

    viernes, 12 de abril de 2013 1:21
  • disculpa no se agrega fila a las Rows debes agregar la variable que estas creando que es row

    edito el ejemplo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 12 de abril de 2013 1:30
  • 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 

    viernes, 12 de abril de 2013 18:31