【问题标题】:Sum of rows in DataTable -- invalid cast?DataTable 中的行总和 - 无效转换?
【发布时间】:2012-12-26 18:10:27
【问题描述】:

1.) ***好的,所以我有从 Excel 电子表格导入的 DataTable 并已填充。我想筛选 DataTable 并对每一行求和。我必须跳过第一列和第一行,因为它们是标签。我试图到达表中的每一行并将其汇总并输出到“行总计”列。当我尝试分配“数字”变量以尝试对每个单元格求和时,我得到一个“指定的无效强制转换”价值。

示例:
行(0) --------ItemA......ItemB.......ItemC....... ....行总计

Column(1) CompanyA .....12 ..........12........10....... .........34

2.) 另外,我还没有达到它——我试图将它输出到 DataTable 的最后一列时存在潜在问题。

注:dr[dt.Columns.Count - 1] = Convert.ToInt32(sum);

有什么想法或建议吗?

            DataRow dr = dt.NewRow();

            int sum = 0;
            dt.Columns.Add("Row Totals", typeof(int));

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

                       int number =0;

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

                        sum += number;

                        dr[dt.Columns.Count - 1] = Convert.ToInt32(sum);


               Console.WriteLine("Row : {0} , Column : {1} , Value : {2}", i,j, dt.Rows[i][j].ToString());
                        Console.WriteLine(sum);
                    }
                    Console.ReadLine();
                }
            }

更新:12/27/12 ************

所以,我正在尝试的解决方案是跳过我知道是文本的行和列。当它尝试过滤每个单元格并将其求和时,我仍然得到“指定的强制转换无效”。还有什么建议吗?

提前谢谢你。


   DataRow dr = dt.NewRow();

            int sum = 0;
            int number = 0;

            for (int i = 0; i < dt.Columns.Count-1; i++)
            {
                if (dt.Columns[i].ColumnName == "column1")
                {
                    dt.Columns.Cast<DataColumn>().Skip(0);

                }
                if (dt.Columns[i].ColumnName == "column2")
                {
                    dt.Columns.Cast<DataColumn>().Skip(1);
                }
                else
                {

                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        dt.Rows.Cast<DataRow>().Skip(0);
                        dt.Rows.Cast<DataRow>().Skip(1);


                        //if (number != -1 && number != 0)
                        //{

                            number = (dt.Rows[j].Field<int>(i));
                            sum += number;
                            dr[dt.Rows.Count] = Convert.ToInt32(sum);
                        //}
                        //else
                        //{
                        //    number = 0;
                        //}


                        Console.WriteLine("Row : {0} , Column : {1} , Value : {2}", i, j, dt.Rows[i][j].ToString());
                        Console.WriteLine(sum);


                    }
                    Console.ReadLine();

                   dataGridView1.DataSource = dt;
                } 


**更新 12/27 下午 1:30 我已经刮掉了所有以前的代码,并正在尝试测试表和输出。它似乎正在工作,但现在当我将它们添加到最后一行时,我似乎无法将它们总计。我被困在代码的“else”部分。

    for (int i = 0; i < dt.Columns.Count - 2; i++)
        {

            for (int j = 0; j < dt.Rows.Count - 1; j++)
            {
                string value = dt.Rows[i][j].ToString();
                int num = 0;
                bool res = int.TryParse(value, out num);
                if (res == false)
                {
                    num = 0;
                }
                else
                {
                    int sum = 0;

                    sum += num;
                    DataRow dr;
                   dr["Totals"] = sum;
                   dt.Rows.Add(dr);
                }
            }


            dataGridView1.DataSource = dt;
        }
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    一种可能性是您的数据表中有一个空白值 - 您不能将空对象强制转换为整数,因此字段扩展方法可能会失败。

    【讨论】:

    • 哦,我没想到我可以添加那个“IsNull”——对吗?
    • @scottO 检查它是否不为空,然后执行求和。
    • 我检查了“-1”,因为它说我不能将 IsNull 与 int 一起使用。它正在通过,现在找不到第 18 列
    • 好吧,所以——我已经通过插入 0 超越了“指定的强制转换无效”。现在,它说它“找不到第 17 列”——尽管如此,索引只有 16我不明白它为什么要寻找第 17 列?
    • 完整的准确错误文本会很有用。另外,dt.Columns.Count - 1 是什么值?
    猜你喜欢
    • 2018-02-08
    • 2014-07-19
    • 2023-03-03
    • 2011-11-29
    • 2015-10-20
    • 2013-07-24
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多