Репост (вроде) - Неверное приведение СНОВА (суммирование строк в DataTable)

У меня есть возможность суммировать каждый столбец и добавить строку - используя этот блок кода:

   DataRow totalRow = t.NewRow();

        int colCount = 1;
        for (int j = 1; j < t.Columns.Count; j++)
        {
            if (t.Columns[j].ColumnName == "Client")
            {
                t.Columns.Cast<DataColumn>().Skip(1);
            }
            else
            {
                int colTotal = 0;
                for (int i = 1; i < t.Rows.Count; i++)
                {

                    colTotal += Convert.ToInt32(t.Rows[i][j]);
                    totalRow[t.Columns[j].ColumnName] = colTotal;

                }
            }
            ++colCount;
        }


        t.Rows.Add(totalRow); <br>


** ПОЧЕМУ О ПОЧЕМУ Я не могу просто изменить это ИЛИ использовать этот блок (ниже) для суммирования строк и вставить новый столбец с итогами каждой строки??? Я не знаю, почему у меня такой блок на этом - я уверен, что это относительно просто, я просто не вижу этого! Это сводит меня с ума - я был в этом в течение 3 дней - это грустно.


  int sum = 0;
    foreach (DataRow rows in dt.Rows)
    {
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            for (int j = 0; j < dt.Rows.Count; j++)
            {


                int number = Convert.ToInt32(dt.Rows[j].Field<int>(i));
                sum += number;
            }
        }

              rows["testrow"] = sum;
        }
            dataGridView1.DataSource = dt;
    }



Ошибка по-прежнему "Указанное приведение неверно" - таблица данных поступает из таблицы Excel. Я могу использовать его на самодельном DataTable просто отлично. Я не понимаю


Этот блок кода работает очень хорошо и дает мне сумму строк в новом столбце


        System.Data.DataTable dt = new System.Data.DataTable();
        dt.Columns.Add("amount1", typeof(int));
        dt.Columns.Add("amount2", typeof(int));
        dt.Columns.Add("amount3", typeof(int));
        dt.Columns.Add("amount4", typeof(int));
        dt.Columns.Add("Row Totals", typeof(int));

        DataRow dr = dt.NewRow();
        dr[0] = 100;
        dr[1] = 200;
        dr[2] = 300;
        dr[3] = 400;
        dr[4] = 0;
        dt.Rows.Add(dr);
        int sum = 0;
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            for (int j = 0; j < dt.Rows.Count; j++)
            {
                //  int sum = 0;

                int number = dt.Rows[j].Field<int>(i);
                sum += number;
                }
            }

2 ответа

Решение

Барабанная дробь, пожалуйста ---

Спасибо, ребята, за комментарии и предложения, которые они помогли мне понять, что именно происходит за кулисами.

    System.Data.DataTable dt = ds.Tables[0];
        dt.Columns.Add("testrow", typeof(int));
        DataRow dr = dt.NewRow();
        int sum = 0;
        for (int i = 1; i < dt.Columns.Count; i++)
        {
            for (int j = 1; j < dt.Rows.Count; j++)
            {

                if (j == dt.Rows.Count - 1)
                {
                    dt.Rows[i][j] = Convert.ToInt32(sum);
                    sum = 0;
            }
                else
                {
                    object number = dt.Rows[i][j];
                   sum += Convert.ToInt32(number);
                }

              }
            dataGridView1.DataSource = dt;
        }

Кажется вероятным, что это не int, а long (или байт), вы можете привести long к int, но вы не можете распаковать long в int, что пытается сделать рассматриваемый код.

если это так, вы можете сделать что-то вроде

var sum = (from column in dt.Columns.AsEnumerable<DataColum>().Skip(1)
           from row in dt.Rows.AsEnumerable<DataRow>().Skip(1)
           where column.ColumnName != "Client"
           select (long)row[column]).Sum();
Другие вопросы по тегам