Репост (вроде) - Неверное приведение СНОВА (суммирование строк в 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();