TreeView到数据库或至少是DataTable

时间:2014-02-08 17:30:39

标签: database datatable treeview

主要问题如何通过所有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        |
+--------------------------+

1 个答案:

答案 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;
    }