我需要动态地从另一个数据创建一个数据表,这样我需要遍历表A的所有行,对列值进行计算并将结果写入表B.例如,表A具有5列(但实际上列数不同)从第二列(A)开始,每列都有一个数值。我需要将它们添加起来并将总数写入表B.
与此相比,表B中的clber的munber将与表A相比而不是行。此数据不会以网格视图或类似形式显示在页面上,因此我无法使用OnEvent方法,因此请不要建议其他替代方法,因为下一个过程需要数据表来生成所需的数据结果
| A | B | C | D | E | (table A)
-------------------------------
Entries | 2 | 6 | 100 | 0 | 5 |
| Totals | (table B)
Entries | 113 |
我见过几个例子,建议使用这种代码创建progamatic数据:
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();
}
但这不是动态的,我只是不能把我的声音包裹起来。所以我开始使用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]);
}
}
感谢。
Risho
最新更新:当我写这篇文章的时候,我脑子里开着微小的灯泡,我制作了这段代码。它没有错误,但它也不起作用。出于测试目的,我试图绑定到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();
}
更新#2:
我做了以下更改,但弹出了一个新错误:
“输入字符串格式不正确。不能存储在Wuc Entries列中。预期类型为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);
}
答案 0 :(得分:0)
好吧,经过多次试验和错误后,我能够通过将trird列更改为typeof(String)来消除错误,这确实不会影响我的数据结果。
但我觉得这并没有真正解决这个问题,我想在其他时间深究这个问题。