0

次のコード ブロックを使用して、各列を合計し、行を追加することができます。

   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>


* *WHY O WHY これを変更するか、このブロック (以下) を使用して行を合計し、各行の合計を含む新しい列を挿入することはできませんか? なぜ私がこれについてそのようなブロックを持っているのかわかりません-私はそれが見えていないだけで比較的単純だと確信しています! それは私を夢中にさせています-私はこれに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;
                }
            }
4

2 に答える 2

1

int ではなく long (または byte) である可能性が高いようです。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();
于 2012-12-28T17:53:11.667 に答える
0

ロールロールしてください---

コメントや提案をありがとうございました。彼らは、舞台裏で何が起こっているのかを正確に理解するために、この時点に到達するのに役立ちました。

    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;
        }
于 2012-12-31T16:36:47.153 に答える