C#代码,用于将子节点添加到树视图控件而不进行循环

时间:2016-10-17 16:58:30

标签: c# asp.net

我编写了一个动态创建树节点和子节点的代码,但添加子节点需要很长时间,因为代码遍历每个项目然后创建子树节点,是否有任何方法可以将所有子节点添加到一个节点中去吗?

            TreeNode TreeNodeDatabase = new TreeNode();
            TreeNodeDatabase.Text = "Database";
            TreeNodeDatabase.Value = "Database";
            TreeNodeDatabase.Expanded = false;
            TreeView1.Nodes.Add(TreeNodeDatabase);

            //Table
            TreeNode TreeNodeTables = new TreeNode();
            TreeNodeTables.Text = "Table";
            TreeNodeTables.Value = "Table";
            TreeNodeTables.Expanded = false;
            TreeNodeDatabase.ChildNodes.Add(TreeNodeTables);

            //Now Add Child Nodes to Table
            DataSet ds = new DataSet();
            HandleDB db = new HandleDB();
            ds = db.returnData("select top 1 name from sys.tables", srvr, dbname);             

            int i = 0;
            for (i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                TreeNode TreeNodeTableName = new TreeNode();

                TreeNodeTableName.Text = ds.Tables[0].Rows[i][0].ToString();
                TreeNodeTableName.Value = ds.Tables[0].Rows[i][0].ToString();
                TreeNodeTableName.Expanded = false;
                TreeNodeTables.ChildNodes.Add(TreeNodeTableName);
            }

2 个答案:

答案 0 :(得分:0)

除非有理由在初始加载期间加载整个树视图,否则您应该按需加载

最简单的方法是:

  1. 根据逻辑级别(Root Node + All Children)加载所有节点。
  2. 存储每个节点的标识符和节点类型。 (您可以附加指向描述每个节点和标识信息的对象的指针。)
  3. 创建一个将加载节点直接死亡的函数(在每个节点级别都需要一个不是组织级别节点的函数)。
  4. 对于每个节点,单击时,确定它是否有子节点,如果没有加载子节点并应用元数据(这里最好在元数据对象上有一个属性,如 HasBeenLoaded 因此,单击时不要对没有子节点的节点进行重复子加载调用。

答案 1 :(得分:0)

TreeView有一个节点TreeNodeCollection。你可能会这样。

TreeView1.Nodes.AddRange([yourtreenodecollection])

您仍然需要通过构建新的TreeNodeCollection来进行一些循环,但是这会比将每个TreeNode手动添加到树中提供更好的性能。似乎没有一种将TreeView绑定到数据库的明确方法。