C# 从动态数据源创建动态数据表

C# 从动态数据源创建动态数据表,c#,asp.net,C#,Asp.net,我需要从另一个数据表中动态创建一个datatable,这样我需要遍历表a的所有行,对列值进行计算,并将结果写入表B。例如,表a有5列(但实际上列数不同),从第二列(a)开始,每列都有一个数值。我需要把它们加起来,把总数写进表B 与表A相比,表B中的团块数量将发生变化,但行数不会发生变化。这些数据不会以gridview或类似的形式显示在页面上,因此我不能使用OneEvent方法,因此请不要建议其他替代方法,因为下一个过程需要datatable来生成所需的结果 | A | B

我需要从另一个数据表中动态创建一个datatable,这样我需要遍历表a的所有行,对列值进行计算,并将结果写入表B。例如,表a有5列(但实际上列数不同),从第二列(a)开始,每列都有一个数值。我需要把它们加起来,把总数写进表B

与表A相比,表B中的团块数量将发生变化,但行数不会发生变化。这些数据不会以gridview或类似的形式显示在页面上,因此我不能使用OneEvent方法,因此请不要建议其他替代方法,因为下一个过程需要datatable来生成所需的结果

            | 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(); 

} 
DataTable dt;
受保护的无效页面加载(对象发送方、事件参数e)
{ 
dt=新数据表(“tblTest”);
DataColumn dc1=新的DataColumn();
dc1.DataType=typeof(字符串);
dc1.ColumnName=“Name”;
DataColumn dc2=新的DataColumn();
dc2.DataType=typeof(字符串);
dc2.ColumnName=“Add1”;
DataColumn dc3=新的DataColumn();
dc3.DataType=typeof(字符串);
dc3.ColumnName=“Add2”;
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
} 
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{ 
会话[“Name”]+=txtName.Text+“|”;
会话[“Add1”]+=txtAdd1.Text+“|”;
会话[“Add2”]+=txtAdd2.Text+“|”;
CreateTable();
} 
public void CreateTable(){
字符串[]sa=Session[“Name”].ToString().Split(“|”);
字符串[]sb=Session[“Add1”].ToString().Split(“|”);
字符串[]sc=Session[“Add2”].ToString().Split(“|”);
int recordnum=sa.Length;
对于(intj=0;j
但这不是动态的,我就是不能把我的耳朵绕到这里。所以我从一个foreach循环开始迭代表a的行和单元格,但不确定如何填充表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]);
        }
    }
foreach(数据行中的数据行)
{
for(int i=2;i
谢谢

里索

最新更新:当我写这篇文章的时候,我脑子里突然出现了一个小小的lighbulbs,我产生了这段代码。它不会出错,但也不起作用。出于测试目的,我尝试绑定到一个gridview,以查看我得到了什么数据——但没有数据。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();
    }
DataTable\u newDt=newdatatable();
DataColumn_dc1=新的DataColumn();
_dc1.DataType=typeof(字符串);
_dc1.ColumnName=“Wuc”;
DataColumn_dc2=新的DataColumn();
_dc2.DataType=typeof(字符串);
_dc2.ColumnName=“Wuc条目”;
DataColumn_dc3=新的DataColumn();
_dc2.DataType=typeof(字符串);
_dc3.ColumnName=“总分录”;
_newDt.Columns.Add(_dc1);
_newDt.Columns.Add(_dc2);
int _total=0;
foreach(数据行中的数据行)
{
数据行_dr=_newDt.NewRow();
DataColumn col1=新的DataColumn();
col1.DataType=typeof(字符串);
col1.ColumnName=row.ItemArray[0].ToString();
DataColumn col2=新的DataColumn();
col2.DataType=typeof(字符串);
col2.ColumnName=row.ItemArray[1].ToString();
DataColumn col3=新的DataColumn();
col3.DataType=typeof(int);
for(int i=2;i
更新#2:

我做了以下更改,但弹出了一个新错误:

“输入字符串的格式不正确。无法存储在Wuc Entries列中。类型应为Int32。”

问题是,我将列作为字符串进行Delcare,父表中的数据是字符串格式的,因此我不理解为什么它需要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);
    }
DataTable\u newDt=newdatatable();
数据行(dr);
DataColumn_dc1=新的DataColumn();
_dc1.DataType=typeof(字符串);
_dc1.ColumnName=“Wuc”;
DataColumn_dc2=新的DataColumn();
_dc2.DataType=typeof(字符串);
_dc2.ColumnName=“Wuc条目”;
DataColumn_dc3=新的DataColumn();
_dc2.DataType=typeof(Int32);
_dc3.ColumnName=“总分录”;
_newDt.Columns.Add(_dc1);
_newDt.Columns.Add(_dc2);
int _total=0;
foreach(数据行中的数据行)
{
_dr=_newDt.NewRow();
_dr[“Wuc”]=row.ItemArray[0].ToString();
_dr[“Wuc Entries”]=row.ItemArray[1].ToString();
for(int i=2;i
好吧,经过多次尝试和错误,我能够通过将trird列更改为typeof(String)来消除错误,这实际上并不影响数据的结果


但我觉得这并没有真正解决问题,我想改天再把这件事弄清楚。

我想你想要的是行[I],而不是行。ItemArray[I]只是一个想法;调用_newDt.NewRow()时,这不会向_newDt;添加行;it j