0

別のデータブルからその場でデータテーブルを作成して、テーブルAのすべての行を反復処理し、列の値を計算して、結果をテーブルBに書き込む必要があります。たとえば、テーブルAには5つの列があります(ただし、実際には列数は異なります)2番目の列(A)から始まり、各列には数値があります。それらを合計して、合計をテーブルBに書き込む必要があります。

これを使用すると、テーブルBのクランバーの数は、テーブルAと比較して変化しますが、行は変化しません。このデータはグリッドビューなどの形式でページに表示されないため、OnEventメソッドを使用できません。次のプロセスでは、目的のデータを生成するためにデータテーブルが必要になるため、他の代替方法を提案しないでください。結果。

            | A | B | C   | D | E |        (table A)
    -------------------------------
    Entries | 2 | 6 | 100 | 0 | 5 |


            | Totals |                      (table B)
    Entries | 113    |

このタイプのコードを使用したプログラムによるデータ作成を示唆するいくつかの例を見てきました。

DataTable dt; 
protected void Page_Load(object sender, EventArgs e) 
{ 


    dt = new DataTable("tblTest"); 
    DataColumn dc1 = new DataColumn(); 
    dc1.DataType = typeof(String); 
    dc1.ColumnName = "Name"; 
    DataColumn dc2 = new DataColumn(); 
    dc2.DataType = typeof(String); 
    dc2.ColumnName = "Add1"; 
    DataColumn dc3 = new DataColumn(); 
    dc3.DataType = typeof(String); 
    dc3.ColumnName = "Add2"; 

    dt.Columns.Add(dc1); 
    dt.Columns.Add(dc2); 
    dt.Columns.Add(dc3); 

} 



protected void Button1_Click(object sender, EventArgs e) 
{ 

    Session["Name"] += txtName.Text + "|"; 
    Session["Add1"] += txtAdd1.Text + "|"; 
    Session["Add2"] += txtAdd2.Text + "|"; 
    CreateTable(); 

} 
public void CreateTable() { 

    string[] sa = Session["Name"].ToString().Split('|'); 
    string[] sb = Session["Add1"].ToString().Split('|'); 
    string[] sc = Session["Add2"].ToString().Split('|'); 
    int recordnum = sa.Length; 

    for (int j = 0; j < recordnum - 1; j++) { 

        DataRow dr = dt.NewRow(); 
        dr["Name"] = sa[j].ToString(); 
        dr["Add1"] = sb[j].ToString(); 
        dr["Add2"] = sc[j].ToString(); 
        dt.Rows.Add(dr); 

    } 

    GridView1.DataSource = dt.DefaultView; 
    GridView1.DataBind(); 

} 

しかし、これは動的ではなく、私はこれに耳を傾けることができません。そのため、テーブルAの行とセルを反復処理するforeachループから始めましたが、テーブルBの個々の行とセルにデータを入力する方法がわかりません。

  foreach (DataRow row in _dt.Rows)
    {
        for (int i = 2; i < row.ItemArray.Length; i++ )
        {
            if (row.ItemArray[i] != DBNull.Value)
                _total += Convert.ToInt32(row.ItemArray[i]);
        }
    }

ありがとう。

リショ

最新の更新:この投稿を書いているときに、頭の中で小さな小さな電球がオンになっていて、このコードを作成しました。エラーは発生しませんが、機能しません。テストの目的で、グリッドビューにバインドして、取得しているデータを確認しようとしましたが、データはありません。statis列の名前はデバッガーに表示され、ソースデータテーブルに適切なデータがあることがわかります。ここにあなたの検査のためのコードがあります:

DataTable _newDt = new DataTable();

    DataColumn _dc1 = new DataColumn();
    _dc1.DataType = typeof(String);
    _dc1.ColumnName = "Wuc";

    DataColumn _dc2 = new DataColumn();
    _dc2.DataType = typeof(String);
    _dc2.ColumnName = "Wuc Entries";

    DataColumn _dc3 = new DataColumn();
    _dc2.DataType = typeof(String);
    _dc3.ColumnName = "Total Entries";

    _newDt.Columns.Add(_dc1);
    _newDt.Columns.Add(_dc2);

    int _total = 0;

    foreach (DataRow row in _dt.Rows)
    {
        DataRow _dr = _newDt.NewRow();

        DataColumn col1 = new DataColumn();
        col1.DataType = typeof(string);
        col1.ColumnName = row.ItemArray[0].ToString();

        DataColumn col2 = new DataColumn();
        col2.DataType = typeof(string);
        col2.ColumnName = row.ItemArray[1].ToString();

        DataColumn col3 = new DataColumn();
        col3.DataType = typeof(int);

        for (int i = 2; i < row.ItemArray.Length; i++ )
        {
            if (row.ItemArray[i] != DBNull.Value)
                _total += Convert.ToInt32(row.ItemArray[i]);
        }

        col3.ColumnName = _total.ToString();
    }

更新#2:

次の変更を行いましたが、新しいエラーが表示されます。

「入力文字列が正しい形式ではありませんでした。Wucエントリ列に格納できませんでした。予期されるタイプはInt32です。」

問題は、列をStringとして削除し、親テーブルのデータが文字列形式であるため、なぜInt32が必要なのか理解できないことです。(?)新しいバージョンは次のとおりです。

    DataTable _newDt = new DataTable();
    DataRow _dr;

    DataColumn _dc1 = new DataColumn();
    _dc1.DataType = typeof(String);
    _dc1.ColumnName = "Wuc";

    DataColumn _dc2 = new DataColumn();
    _dc2.DataType = typeof(String);
    _dc2.ColumnName = "Wuc Entries";

    DataColumn _dc3 = new DataColumn();
    _dc2.DataType = typeof(Int32);
    _dc3.ColumnName = "Total Entries";

    _newDt.Columns.Add(_dc1);
    _newDt.Columns.Add(_dc2);

    int _total = 0;

    foreach (DataRow row in _dt.Rows)
    {
        _dr = _newDt.NewRow();

        _dr["Wuc"] = row.ItemArray[0].ToString();
        _dr["Wuc Entries"] = row.ItemArray[1].ToString();

        for (int i = 2; i < row.ItemArray.Length; i++ )
        {
            if (row.ItemArray[i] != DBNull.Value)
                _total += Convert.ToInt32(row.ItemArray[i]);
        }

        _dr["Total Entries"] = _total;
        _newDt.Rows.Add(_dr);
    }
4

1 に答える 1

0

まあ、多くの試行錯誤の後、trird 列を typeof(String) に変更することでエラーを解消することができましたが、これは実際にはデータの結果に影響しませんでした。

しかし、これで問題が解決したわけではないと感じているので、別の機会にこの問題を解決したいと思います。

于 2013-02-18T22:48:46.363 に答える