別のデータブルからその場でデータテーブルを作成して、テーブル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);
}