【发布时间】:2020-06-06 05:02:21
【问题描述】:
我正在尝试使用 foreach 循环创建树视图节点。我有 2 个数据表,当前正在使用 foreach 循环来获取行。我的第一个 foreach 循环成功地将第一个数据表行放入树视图节点。问题是将第二个数据表行放入每个父节点。
第一个数据表的结构是:
job |suffix
J000027399 0
J000027399 1
J000027399 2
J000027399 3
J000027399 4
J000027399 5
第二个表结构是:
job |suffix|operNum
J000027399 0 10
J000027399 0 20
J000027399 0 30
J000027399 1 10
J000027399 1 20
J000027399 2 10
J000027399 3 10
J000027399 4 10
J000027399 4 20
J000027399 5 10
第三个表结构是:
job |suffix|operNum|seq|item
J000027399 0 30 1 item_1
J000027399 0 30 2 item_2
J000027399 0 30 3 item_3
J000027399 0 30 4 item_4
J000027399 1 10 1 item_1
J000027399 1 10 2 item_2
J000027399 1 10 3 item_3
J000027399 1 20 1 item_1
J000027399 1 20 2 item_2
J000027399 2 10 1 item_1
J000027399 3 10 1 item_1
J000027399 4 10 1 item_1
J000027399 4 10 2 item_2
J000027399 4 20 1 item_1
J000027399 5 10 1 item_1
我需要像这样填充树节点:
0
10
20
30
1
2
3
4
1
10
1
2
3
20
1
2
2
10
1
3
10
1
4
10
1
2
20
1
5
10
1
父节点基于第一个数据表后缀,子节点基于第二个数据表opernum,第三个数据表基于每个后缀节点的每个opernum下的seq。
这是我目前的代码
using (SqlDataAdapter jobAdapter = new SqlDataAdapter(cmd))
{
DataTable dtJ = new DataTable();
jobAdapter.Fill(dtJ);
foreach (DataRow jRow in dtJ.Rows)
{
tvBomView.Nodes.Add("job", jRow["Suffix"].ToString());
}
SqlCommand cmdStageTwo = new SqlCommand("dbo.CHS_Bom_View_Grab_JobRoute", conn);
cmdStageTwo.CommandType = CommandType.StoredProcedure;
cmdStageTwo.Parameters.Add("@Job", SqlDbType.NVarChar, 10).Value = txtJob.Text;
using (SqlDataAdapter jobRouteAdapter = new SqlDataAdapter(cmdStageTwo))
{
DataTable dtJR = new DataTable();
jobRouteAdapter.Fill(dtJR);
foreach (TreeNode node in tvBomView.Nodes)
{
foreach (DataRow jrRow in dtJR.Rows)
{
if (node.Text != jrRow["Suffix"].ToString())
{
break;
}
else if (node.Text == jrRow["Suffix"].ToString())
{
tvBomView.Nodes["job"].Nodes.Add("oper", "Oper: " +
jrRow["OperNum"].ToString());
}
}
}
}
}
【问题讨论】:
-
我认为打破循环可能是问题所在。
-
如果我中断它会将所有数据仅写入第一个父节点。
-
是的,因为我已经调试了代码。第一个 foreach 循环运行,第二个循环遍历 jrRow[] 中的所有数据并填充第一个节点,即使它为假。
-
我认为你最好加入这两个表,并使用 GroupBy 然后将其绑定到你的 TreeList。