使用循环来创建节点对象效率 
有如下代码: 
while (odr_1 != null && odr_1.Read()) 
        { 
            TreeNode t_child = new TreeNode(); 
            t_child.Value = odr_1["ID"].ToString(); 
            t_child.Text =  odr_1["xzqmc"].ToString(); 
            t_parent.ChildNodes.Add(t_child); 
            if (level > 1) 
                node_insert(t_child, level - 1); 
        } 
        odr_1.Close(); 
当循环次数多时,性能明显受到影响,要怎么修改? 
请教高手!PS:有说每次装载n+1层。 
展开下一层后再往下一层。 
装载的时候锁住更新。
那怎么实现呢?谢谢

解决方案 »

  1.   

    用递归创建节点
    TreeNode root=new TreeNode(); 
        root.Text=""; 
        this.TreeView1.Nodes.Add(root); 
        this.InitTree(this.TreeView1.Nodes[0].Nodes,0,dt); 
    protected void initTree(DataTable dt, string nFather, TreeNode fatherNode) 
        { 
            DataView dv = new DataView(dt); 
            dv.RowFilter = "sNum='"+nFather+"'"; 
            foreach (DataRowView Row in dv) 
            { 
              TreeNode node = new TreeNode(); 
              if (是否有子集) 
                { 
                  node.Value = Row[""].ToString(); 
                  node.Text = Row[""].ToString(); 
                  fatherNode.ChildNodes.Add(node); 
                  initTree(dt, Row["pNum"].ToString(), node); 
                } 
                else 
                { 
                    node.Text = Row[""].ToString(); 
                    node.Value = Row[""].ToString(); 
                    fatherNode.ChildNodes.Add(node); 
              } 
            } 
        } 
    http://topic.csdn.net/u/20090825/09/35619369-e39b-4b8c-9659-f5e07e2f826d.html
    http://topic.csdn.net/u/20090729/20/c108a8a9-7faf-4066-9135-1b52a7b50345.html
      

  2.   

    我也想知道
    另外用递归是一层一层的展开吗?
    那循环里面的 t_child.Value = odr_1["ID"].ToString(); 
                t_child.Text =  odr_1["xzqmc"].ToString(); 
    中的ID和xzqmc在递归里不需要写了吗?
      

  3.   

          TreeView TV;            TV.BeginUpdate();
                 ... AddNode...
                TV.EndUpdate(); 
               
    或者最外面再包一层
    this.SuspendLayout();

    this.ResumeLayout(true);
          
      

  4.   

      意思是这样吗?
    TreeView TV;             TV.BeginUpdate(); 
                while (odr_1 != null && odr_1.Read()) 
            { 
                TreeNode t_child = new TreeNode(); 
                t_child.Value = odr_1["ID"].ToString(); 
                t_child.Text =  odr_1["xzqmc"].ToString(); 
                t_parent.ChildNodes.Add(t_child); 
                if (level > 1) 
                    node_insert(t_child, level - 1); 
            } 
            odr_1.Close(); 
                TV.EndUpdate(); 
      

  5.   

    差不多,最好是写在异常里this.SuspendLayout(); 
        TV.BeginUpdate(); 
    try
    {
                while (odr_1 != null && odr_1.Read()) 
            { 
                TreeNode t_child = new TreeNode(); 
                t_child.Value = odr_1["ID"].ToString(); 
                t_child.Text =  odr_1["xzqmc"].ToString(); 
                t_parent.ChildNodes.Add(t_child); 
                if (level > 1) 
                    node_insert(t_child, level - 1); 
            } 
            odr_1.Close(); 
    }
    finally
    {
                TV.EndUpdate(); 
               this.ResumeLayout(true); }
    此外如果节点比较多,最好不要递归,而是只购建第一级节点,点击节点后再购建下一层子节点
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication39
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            TreeView TV = new TreeView();
                TV.Parent = this;
                TV.Dock = DockStyle.Fill;            TreeNode TN = TV.Nodes.Add("根");
                TV.AfterSelect += new TreeViewEventHandler(TV_AfterSelect);
            }        void TV_AfterSelect(object sender, TreeViewEventArgs e)
            {
                // 实际可以从数据库里读出来
                e.Node.Nodes.Add((e.Node.Level + 1) + " " + NowString());
                e.Node.Nodes.Add((e.Node.Level + 1) + " " + NowString());
                e.Node.Nodes.Add((e.Node.Level + 1) + " " + NowString());
                e.Node.Expand();
            }        String NowString()
            {
                return DateTime.Now.ToString("HH:mm:ss.fff");
            }
        }
    }