fila - datatable columns add c#
Datatable-Suma cada celda en una fila (6)
Código de ejemplo para la respuesta de Yuriy:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
namespace DynamicColumns
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Total all quantity columns");
var dt = new DataTable ();
dt.Columns.Add ("ProductName", typeof(string));
dt.Columns.Add ("Qty1", typeof(int));
dt.Columns.Add ("Qty2", typeof(int));
dt.Columns.Add ("Qty3", typeof(int));
{
var dr = dt.NewRow ();
dr ["ProductName"] = "Keyboard";
dr ["Qty1"] = 2;
dr ["Qty2"] = 5;
dr ["Qty3"] = 6;
dt.Rows.Add (dr);
}
{
var dr = dt.NewRow ();
dr ["ProductName"] = "Mouse";
dr ["Qty1"] = 5;
dr ["Qty2"] = 1;
dr ["Qty3"] = 2;
dt.Rows.Add (dr);
}
string expression =
string.Join (" + ",
dt.Columns.OfType<DataColumn>()
.Where(x => x.DataType == typeof(int))
.Select(x => x.ColumnName)
.ToArray() );
dt.Columns.Add("Total", typeof(int)).Expression = expression;
Console.WriteLine ("Expression: {0}",expression);
Console.WriteLine ("/nProduct and totals");
foreach (var r in dt.Rows.OfType<DataRow>()) {
Console.WriteLine ("{0} {1}", r["ProductName"], r["Total"]);
}
}
}
}
Salida:
Expression: Qty1 + Qty2 + Qty3
Product and totals
Keyboard 13
Mouse 8
Me arriesgaría a adivinar que esta (expresión) es la solución más eficiente en comparación con el método lambda para llegar a cada fila de cada columna, e incluso se compara con el bucle de cada fila y columna.
Hay muchos ejemplos de cómo obtener la suma de cada celda en una columna. No he podido encontrar un ejemplo de cómo sumar cada celda en una fila y agregar ese total en la nueva columna llamada "Total", por ejemplo.
C # DataTable tiene DataTable1.Compute("SUM(["Column Name"])", "")
Ejemplo de lo que me gustaría hacer a continuación. Sin embargo, también me gustaría poder excluir columnas específicas, ya que pueden no contener números.
Editar La tabla es dinámica y el número de columnas puede cambiar.
DataTable tiene capacidad para crear columnas calculadas. En su caso, puede crear una columna "Total" como
DataTable1.Columns.Add("Total", typeof(Double));
DataTable1.Columns["Total"].Expression = "C1+C2+C3";
Prueba esto.
DataTable1.Columns.Add("Total", typeof(Double));
foreach (DataRow row in DataTable1.Rows)
{
int sum = row.Columns.Cast<DataColumn>().Sum(dc=>(int)row[dc]);
row.SetField("Total", sum);
}
Puedes usar este ciclo:
table.Columns.Add("Total", typeof(decimal));
foreach (DataRow row in table.Rows)
{
decimal rowSum = 0;
foreach (DataColumn col in table.Columns)
{
if(!row.IsNull(col))
{
string stringValue = row[col].ToString();
decimal d;
if(decimal.TryParse(stringValue, out d))
rowSum += d;
}
}
row.SetField("Total", rowSum);
}
Esto debería funcionar con cualquier tipo de columna.
Voy a probar algo como esto:
foreach (DataRow row in table.Rows) {
var rowSum = 0d;
foreach (DataColumn column in row.Table.Columns) {
//if row[column] is number
rowSum += Convert.ToDouble(row[column]));
//}
}
//at his point you have the the colums sum
}
DataTable1.Columns.Add("C1", typeof(Double));
DataTable1.Columns.Add("C2", typeof(Double));
DataTable1.Columns.Add("C3", typeof(Double));
DataTable1.Columns.Add("Total", typeof(Double));
DataTable1.Columns["Total"].Expression = "C1+C2+C3";
Esta es la manera más fácil .. !