你有一个包含3个字段的数据表,我的预期树视图将在下面的图像中显示。
我的数据表会返回这样的详细信息。
我尝试了以下代码。这里子节点没有正确列出
public void BuildTree(DataTable dt, TreeView trv, Boolean expandAll)
{
trv.Nodes.Clear();
TreeNode node = default(TreeNode);
TreeNode subNode = default(TreeNode);
foreach (DataRow row in dt.Rows)
{
node = Searchnode(row[0].ToString(), trv);
if (node != null)
{
subNode = new TreeNode(row[1].ToString());
node.Nodes.Add(subNode);
}
else
{
node = new TreeNode(row[0].ToString());
subNode = new TreeNode(row[1].ToString());
node.Nodes.Add(subNode);
trv.Nodes.Add(node);
}
}
if (expandAll)
{
trv.ExpandAll();
}
}
private TreeNode Searchnode(string nodetext, TreeView trv)
{
foreach (TreeNode node in trv.Nodes)
{
if (node.Text == nodetext)
{
return node;
}
}
return null;
}
答案 0 :(得分:1)
我认为该数据表是按CustomerName,DeliverySchedule,Name
进行的。初始化测试数据:
private void InitializeDataTable() {
dt = new DataTable();
dt.Columns.Add("DeliverySchedule");
dt.Columns.Add("Name");
dt.Columns.Add("CustomerName");
AddRow("Daily", "Test", "Team Venkat");
AddRow("Daily", "TestB", "Team Venkat");
AddRow("Weekly", "OtherName", "Team Venkat");
AddRow("Weekly", "OtherName2", "Team Venkat");
AddRow("Daily", "Test", "Team2");
AddRow("Weekly", "Test", "Team2");
}
private void AddRow(string schedule, string name, string customer) {
DataRow row = dt.NewRow();
row[0] = schedule;
row[1] = name;
row[2] = customer;
dt.Rows.Add(row);
}
使用三级循环从DataTable加载树:
private void LoadBtn_Click(object sender, EventArgs e) {
int i = 0;
treeView1.Nodes.Clear();
while (i < dt.Rows.Count) {
DataRow row = dt.Rows[i];
string customer = row.Field<string>(2);
TreeNode customerNode = treeView1.Nodes.Add(customer);
while (i < dt.Rows.Count && row.Field<string>(2) == customer) {
string schedule = row.Field<string>(0);
TreeNode scheduleNode = customerNode.Nodes.Add(schedule);
while (i < dt.Rows.Count && row.Field<string>(2) == customer && schedule == row.Field<string>(0)) {
string report = row.Field<string>(1);
scheduleNode.Nodes.Add(report);
if (++i < dt.Rows.Count)
row = dt.Rows[i];
}
}
}
}