csharp: sum columns or rows in a dataTable

            DataTable dt = setData();
            // Sum rows.
            //foreach (DataRow row in dt.Rows)
            //{
            //    int rowTotal = 0;
            //    foreach (DataColumn col in row.Table.Columns)
            //    {
            //        Console.WriteLine(row[col]);
            //        rowTotal += Int32.Parse(row[col].ToString());
            //    }
            //    Console.WriteLine("row total: {0}", rowTotal);
            //}
            //// Sum columns.
            //foreach (DataColumn col in dt.Columns)
            //{
            //    int colTotal = 0;
            //    foreach (DataRow row in col.Table.Rows)
            //    {
            //        Console.WriteLine(row[col]);
            //        colTotal += Int32.Parse(row[col].ToString());
            //    }
            //    Console.WriteLine("column total: {0}", colTotal);
            //}
            //列統計 https://stackoverflow.com/questions/5601752/how-to-sum-columns-in-a-datatable
            DataRow totalsRow = dt.NewRow();
            foreach (DataColumn col in dt.Columns)
            {
                int colTotal = 0;
                foreach (DataRow row in col.Table.Rows)
                {
                    if (col.ColumnName != "Branch")
                    {
                        colTotal += Int32.Parse(row[col].ToString());
                    }
                }
                totalsRow[col.ColumnName] = colTotal;
            }
            dt.Rows.Add(totalsRow);
            dt.Rows[dt.Rows.Count - 1]["Branch"] = "合計";
            //行統計要增加一列 
            //https://stackoverflow.com/questions/19053430/datatable-sum-each-cell-in-a-row
            dt.Columns.Add("Total", typeof(decimal));
            foreach (DataRow row in dt.Rows)
            {
                decimal rowSum = 0;
                foreach (DataColumn col in dt.Columns)
                {
                    if (col.ColumnName != "Branch")
                    {
                         if (!row.IsNull(col))
                        {
   
                            string stringValue = row[col].ToString();
                            decimal d;
                            if (decimal.TryParse(stringValue, out d))
                                rowSum += d;
                        }
                    }
                }
                row.SetField("Total", rowSum);
            }


            this.dataGridView1.DataSource = dt;

  

  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;

            //DataTable1.Columns["Total"].Expression = "C1+C2+C3";
            //dt.Columns.Add("Total", typeof(Double));
            //foreach (DataRow row in dt.Rows)
            //{
            //    int sum = row<DataColumn>().Sum(dc => (int)row[dc]);
            //    row.SetField("Total", sum);
            //}
            DataRow drt = dt.NewRow();
            drt[0] = "Totals"; 
            for (int i = 1; i < dt.Columns.Count; i++)
            {
                //1.
                //drt[dt.Columns[i].ColumnName] = dt.Compute("Sum(" + dt.Columns[i].ColumnName + ")", "");
                //2.
                drt[dt.Columns[i].ColumnName] = (from DataRow dr in dt.AsEnumerable()
                                                 where dr.RowState != DataRowState.Deleted
                                                 select Convert.ToInt32(dr[dt.Columns[i].ColumnName])).Sum(); 
                
            }
           // int sum = Convert.ToInt32(dt.Compute("SUM(Salary)", "EmployeeId > 2"));
            //int linqSum = (from DataRow dr in dt.AsEnumerable()
            //               where dr.RowState != DataRowState.Deleted
            //               select Convert.ToInt32(dr["ColumnName"])).Sum();  

            dt.Rows.Add(drt); 

            this.dataGridView1.DataSource = dt;

  

posted @ 2017-05-23 16:29  ®Geovin Du Dream Park™  阅读(497)  评论(0编辑  收藏  举报