none
llenar un datatable con varios textbox RRS feed

  • Pregunta

  • necesito llenar un datatable con varios textbox , ahorita lo tengo con puro if pero ocupo mucho espacio, hay una forma de  simplificar.

      DataTable dt = new DataTable();
                dt.Columns.Add("Nombre");
                dt.Columns.Add("T");
                dt.Columns.Add("I");
                dt.Columns.Add("Kg");
                dt.Columns.Add("SI");
                dt.Columns.Add("NO");

                if (Planta1PesoAceite.Text != "0")
                {
                    DataRow row = dt.NewRow();
                    row["Nombre"] = Nombre2.Text;
                    row["T"] = "X";
                    row["I"] = "";
                    row["Kg"] =planta1PesoAceite.Text;
                    row["SI"] = "";
                    row["NO"] = "";
                    dt.Rows.Add(row);
                }
                if (planta1PesoAgua.Text != "0")
                {
                    DataRow row = dt.NewRow();
                    row["Nombre"] = nombreAgua.Text;
                    row["T"] = "X";
                    row["Kg"] = planta1Pesoagua.Text;
                    row["SI"] = "";
                    row["NO"] = "";
                    dt.Rows.Add(row);
                }
                if (planta1PesoBal.Text != "0")
                {
                    DataRow row = dt.NewRow();
                    row["Nombre"] = NombreBala.Text;
                    row["T"] = "X";
                    row["I"] = "";
                    row["Kg"] = planta1PesoB.Text;
                    row["SI"] = "";
                    row["NO"] = "";
                    dt.Rows.Add(row);
                }

    miércoles, 16 de octubre de 2019 12:14

Respuestas

  • Puedes pasar las seis columnas directamente al dt.Rows.Add (tiene una sobrecarga que acepta directamente todas las columnas en lugar de un Row). Esto reduce el contenido de cada "if" a una sola línea de código.

                 if (Planta1PesoAceite.Text != "0")
                 {
                     dt.Rows.Add(Nombre2.Text, "X", "", planta1PesoAceite.Text, "", "");
                 }

    Y lo mismo los otros bloques.

    • Marcado como respuesta danielglez miércoles, 16 de octubre de 2019 13:24
    miércoles, 16 de octubre de 2019 13:17
  • No sé si me estoy perdiendo algo, pero me da la impresión de que estás examinando todo el rato la fila cero, Rows[0], en lugar de usar la fila sobre la que está iterando el "foreach", row. Aparte de eso, no estás cambiando dentro del bucle el valor de la variable i, por lo que siempre "machacas" la misma celda en $"A{i}", en lugar de ir pasando a una celda nueva en cada iteración.

    int i=1;
    foreach (DataRow row in dt.Rows)
    {
        if (row[11].ToString() == "planta1")
        {
            ws.Cells[$"A{i++}"].Value = row[0];
        }
    } 

    • Marcado como respuesta danielglez miércoles, 16 de octubre de 2019 18:34
    miércoles, 16 de octubre de 2019 16:32

Todas las respuestas

  • Puedes pasar las seis columnas directamente al dt.Rows.Add (tiene una sobrecarga que acepta directamente todas las columnas en lugar de un Row). Esto reduce el contenido de cada "if" a una sola línea de código.

                 if (Planta1PesoAceite.Text != "0")
                 {
                     dt.Rows.Add(Nombre2.Text, "X", "", planta1PesoAceite.Text, "", "");
                 }

    Y lo mismo los otros bloques.

    • Marcado como respuesta danielglez miércoles, 16 de octubre de 2019 13:24
    miércoles, 16 de octubre de 2019 13:17
  • ok muchs gracias por que en si son como 13 componentes y 4 plantas, y con eso reduce demasiado las lineas de codigo

    miércoles, 16 de octubre de 2019 13:24
  • no se si este bien como lo estoy pensndo pero haz de cuenta que si este bien pero la idea es que si peso del aceite de la primera planta es mayor o diferente a 0 se llena el datatable, igual si el peso del agua es mayor a 0, se agreg un row, por lo tanto son 2 row, pero nomas me imprime el ultimo nombre. lo estoy mandando a un excel y por epplus

    foreach (DataRow row in dt.Rows)
                                {
                                    if (dt.Rows[0][11].ToString() == "planta1") { ws.Cells[$"A{i}"].Value = row[0]; }

                                }

    del ejemplo de hace rato agrege otra columna que diga planta, y se inserta planta 1 

    miércoles, 16 de octubre de 2019 15:15
  • No sé si me estoy perdiendo algo, pero me da la impresión de que estás examinando todo el rato la fila cero, Rows[0], en lugar de usar la fila sobre la que está iterando el "foreach", row. Aparte de eso, no estás cambiando dentro del bucle el valor de la variable i, por lo que siempre "machacas" la misma celda en $"A{i}", en lugar de ir pasando a una celda nueva en cada iteración.

    int i=1;
    foreach (DataRow row in dt.Rows)
    {
        if (row[11].ToString() == "planta1")
        {
            ws.Cells[$"A{i++}"].Value = row[0];
        }
    } 

    • Marcado como respuesta danielglez miércoles, 16 de octubre de 2019 18:34
    miércoles, 16 de octubre de 2019 16:32
  • si me faltaba eso, es que tenia un codigo parecido pero el otro lo lleno con un gridview y copie el codigo y se me paso copiar el codigo I=i+1 

    miércoles, 16 de octubre de 2019 18:35