1

1.) ***わかりました。Excel SpreadSheet からインポートされた DataTable があり、データが入力されています。DataTable をふるいにかけ、各行を合計したいと思います。最初の列と最初の行はラベルであるため、スキップする必要があります。テーブルの各行に到達して合計し、「行合計」列に出力しようとしています.「数値」変数を割り当てて各セルを合計しようとすると、「無効なキャストが指定されました」というメッセージが表示されます価値。

例:
Row(0) --------------------ItemA......ItemB.......ItemC........ ......RowTotal

列(1) A社 ..........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;
                } 


* *UPDATE 12/27 1:30pm 以前のコードをすべてスクラッチして、テスト シートと出力を試みています。最後の行にアイテムを追加するときに、アイテムを合計できないように見えることを除いて、機能しているようです。コードの「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;
        }
    }
4

1 に答える 1

1

1つの可能性は、データテーブルに空白の値があることです。nullオブジェクトを整数にキャストできないため、Field拡張メソッドが失敗する可能性があります。

于 2012-12-26T18:20:43.870 に答える