TreeView to database or at least DataTable

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Aleksandr
    New Member
    • Feb 2014
    • 2

    #1

    TreeView to database or at least DataTable

    The main question how to fully traverse/circumvent through all TreeView, for transforming Tree structure into a Table structure.
    I want to note that the TreeView may contain a different number of branches, with different depths and different names.
    I found a lot of information how to populate TreeView e.g. from DataTable, but I didn’t found information how to recursively traverse/circumvent a TreeView and populate/fill data e.g. to DataTable.

    As sample I have following TreeView:
    Aaron
    -Baldwin
    --Caleb
    ---Dale
    --Earl
    -Fabian
    Gabriel
    -Harold
    -Ian

    Necessary to convert the TreeView into e.g. 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
  • Aleksandr
    New Member
    • Feb 2014
    • 2

    #2
    Following code is work well:
    Code:
    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]);
            }
    But there is still several things that I don't know how to realize:
    1. Do not use global variable (List<string> name) for collecting result;
    2. Correctly collect data perhaps in DataTable, in format "1 | Aaron | null".
    Please chech code below, and fix mistaks:
    Code:
    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;
            }

    Comment

    Working...