主要问题如何通过所有TreeView完全遍历/规避,在C#上将Tree结构转换为表结构? 我想要注意,TreeView可能包含不同数量的分支,具有不同的深度和不同的名称。 我发现了很多关于如何填充TreeView的信息,例如从DataTable,但我没有找到信息如何递归遍历/绕过TreeView并填充/填充数据,例如到DataTable。
作为示例,我有以下TreeView:
Aaron
-Baldwin
--Caleb
---Dale
--Earl
-Fabian
Gabriel
-Harold
-Ian
有必要将TreeView转换为例如DataTable:
+--------------------------+
| id | Name | ParentId |
+--------------------------+
| 1 | Aaron | null |
| 2 | Baldwin | 1 |
| 3 | Caleb | 2 |
| 4 | Dale | 3 |
| 5 | Earl | 2 |
| 6 | Fabian | 1 |
| 7 | Gabriel | null |
| 8 | Harold | 7 |
| 9 | Ian | 7 |
+--------------------------+
答案 0 :(得分:0)
以下代码运作良好:
private void buttonSave_Click(object sender, EventArgs e)
{
TraverseTreeView(treeView1);
string temp = String.Empty;
foreach (string str in name)
temp += str + Environment.NewLine;
MessageBox.Show(temp);
name.Clear();
}
List<string> name = new List<string>();
private void TraverseTreeView(TreeView tview)
{
TreeNode temp = new TreeNode();
for (int k = 0; k < tview.Nodes.Count; k++)
{
temp = tview.Nodes[k];
name.Add(k+"\t"+temp.Text+"\tnull");
for (int i = 0; i < temp.Nodes.Count; i++)
visitChildNodes(temp.Nodes[i]);
}
}
private void visitChildNodes(TreeNode node)
{
name.Add(node.Text);
for (int j = 0; j < node.Nodes.Count; j++)
visitChildNodes(node.Nodes[j]);
}
但仍有几件事我不知道如何实现: 1.不要使用全局变量(列表名称)来收集结果; 2.在DataTable中正确收集数据,格式为“1 | Aaron | null”。 请在下面填写代码并修复错误:
private void buttonSave_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt = TraverseTreeView(treeView1);
string temp = String.Empty;
foreach (string str in dt)
temp += str + Environment.NewLine;
MessageBox.Show(temp);
dt.Clear();
}
//List<string> name = new List<string>();
private DataTable TraverseTreeView(TreeView tview)
{
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("Name");
dt.Columns.Add("ParentId", typeof(int));
TreeNode temp = new TreeNode();
for (int k = 0; k < tview.Nodes.Count; k++)
{
temp = tview.Nodes[k];
dt.Rows.Add(k, temp.Text, null);
//name.Add(temp.Text);
for (int i = 0; i < temp.Nodes.Counst; i++)
dt.Rows.Add(i, visitChildNodes(temp.Nodes[i]).Text, i - 1);
}
return dt;
}
private DataTable visitChildNodes(TreeNode node)
{
//name.Add(node.Text);
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("Name");
dt.Columns.Add("ParentId", typeof(int));
for(int j = 0; j < node.Nodes.Count; j++)
dt.Rows.Add(j, visitChildNodes(node.Nodes[j]).Text, j - 1);
return dt;
}