数据库里有五百多条数据,但是我用的方法加载树时却很慢,有没有什么好的方法能让树加载的快一点

解决方案 »

  1.   

    先把数据全部查询出来。放在DataTable 或都别的集合里。 在加载树的时间,再从集合里查询。这样就查询一次数据,就可以了。
      

  2.   

    private void GetData(int parentid, TreeNode pnode)
            {
                DataSet ds = new DataSet();
                string sqlStr = string.Format("select * from functionlist where parentID=0");
                OleDbDataAdapter adp = new OleDbDataAdapter(sqlStr, oleConnection1);
                ds.Clear();
                adp.Fill(ds, "check");
                DataTable table = ds.Tables[0];
                foreach (DataRow dr in table.Rows)
                {
                    TreeNode node = new TreeNode();
                    node.Name = dr["id"].ToString();
                    node.Tag = "0";
                    node.Text = dr["CN"].ToString();
                    treeView1.Nodes.Add(node);
                    CreateTree(node);
                }
            }
            private void CreateTree(TreeNode treeNode)
            {   //name id; tag  parentID
                //查找子节点
                DataSet ds = new DataSet();
                string sqlStr = string.Format("select * from functionlist where parentID={0}", treeNode.Name);
                OleDbDataAdapter adp = new OleDbDataAdapter(sqlStr, oleConnection1);
                ds.Clear();
                adp.Fill(ds);
                DataTable table = ds.Tables[0];
                if (table.Rows.Count > 0)
                {
                    foreach (DataRow dr in table.Rows)
                    {
                        TreeNode node = new TreeNode();
                        node.Name = dr["id"].ToString();
                        node.Tag = dr["parentID"].ToString();
                        node.Text = dr["CN"].ToString();
                        treeNode.Nodes.Add(node);
                        CreateTree(node);
                    }
                }
            }
      

  3.   

    建议你使用递归,从数据库里面读取,根据父级编码递归就可以了,不管多少层都可以实现:        /// <summary>
            /// 加载部门
            /// </summary>
            public void InialData()
            {
                try
                {
                    this.advTreePathSort.Nodes.Clear();
                    this.advTreePathSort.Refresh();
                    this.nodePart.Nodes.Clear();
                    int tt = this.advTreePathSort.Nodes.Count; 
                    
                    //查找部门 
                    List<TMIS.Model.Department> lstType = tdb.bllDepartment.GetModelList("  fartherId='001'");
                    foreach (TMIS.Model.Department itemList in lstType)
                    {
                        DevComponents.AdvTree.Node nodeBig = new DevComponents.AdvTree.Node();
                        nodeBig.Name = itemList.typeid;
                        nodeBig.Text = itemList.Name;
                        nodeBig.CheckBoxVisible = false;
                        this.nodePart.Nodes.Add(nodeBig);
                        //查找本部门的下级部门
                        Load_User_List_Part(itemList.typeid, ref nodeBig);
                    }
                    this.advTreePathSort.Nodes.Add(nodePart);
                    this.advTreePathSort.Refresh();
                    this.advTreePathSort.ExpandAll();
                }
                catch (Exception ex)
                {
                }
            }        /// <summary>
            /// 递归
            /// </summary>
            /// <param name="_pid"></param>
            /// <param name="nodeMain"></param>
            private void Load_User_List_Part(string _pid, ref DevComponents.AdvTree.Node nodeMain)
            {
                try
                {
                    if (_pid == null)
                    {
                        _pid = "";
                    }                //查找当前级别的下级
                    List<TMIS.Model.Department> lstType = tdb.bllDepartment.GetModelList("  fartherId='" + _pid + "'  ");
                    foreach (TMIS.Model.Department itemList in lstType)
                    {
                        DevComponents.AdvTree.Node nodeBig = new DevComponents.AdvTree.Node();
                        nodeBig.Name = itemList.typeid;// 部门,不加载编号 itemList.fPartID;
                        nodeBig.Text = itemList.Name;
                        nodeBig.CheckBoxVisible = false;
                        //查找小类别
                        Load_User_List_Part(itemList.typeid, ref nodeBig);                    nodeMain.Nodes.Add(nodeBig);
                    }
                }
                catch (Exception ex)
                {
                }
            }
      

  4.   

    使用递归private List<Sys_right> GetTreeRight(string _parent_code)
            {
                List<Sys_right> list = new List<Sys_right>();
                df = new DataAccessFactory();
                da = df.CreateDataAccess();
                string sql = " select * from sys_tree_right  Where parent_code=@parent_code  order by next_code";
                da.AddFieldsParameters("parent_code", _parent_code);
                da.SetDefaultCommandTextSql(sql);
                DataTable table = da.ExecuteAndReturnDataTable();
                foreach (DataRow row in table.Rows)
                {
                    Sys_right sr = new Sys_right();
                    sr.Parent_code = (string)row["parent_code"];
                    sr.Next_code = (string)row["next_code"];
                    sr.Content = (string)row["content"];
                    sr.Url = (string)row["url"];
                    sr.Image = (string)row["image"];
                    sr.Target=(string)row["target"];
                    list.Add(sr);
                }
                //reader.Dispose();
                return list;
                // parent_code   next_code   content    url  image
            }
                   public  void LoadFilesTree(TreeView TreeView1)
            {
                TreeView1.Nodes.Clear();
                
                List<Sys_right> nodes = GetTreeRight("root");//得到所有第一层节点文件            foreach (Sys_right node in nodes)
                {
                    string parent_code = node.Parent_code;
                    string next_code = node.Next_code;
                    string content = node.Content;
                    string url = node.Url;
                    string image = node.Image;
                    string target = node.Target;
                    if (content.Length > 19)
                    {
                        content = content.Substring(0, 8) + "...";
                    }                TreeNode Node = CreatTreeNode(content, next_code, url, image, target);
                    CreateFileTree(next_code, Node);
                    TreeView1.Nodes.Add(Node);
                    //TreeView1.FindNode("L01").Expand();
                }        }
            //递归显示所有文件——创建其他子节点
            private  void CreateFileTree(string nodeId, TreeNode Node)
            {
                List<Sys_right> nodes = GetTreeRight(nodeId);//获得父节点Id得到所有的子文件信息
                foreach (Sys_right node in nodes)
                {
                    string parent_code = node.Parent_code;
                    string next_code = node.Next_code;
                    string content = node.Content;
                    string url = node.Url;
                    string image = node.Image;
                    string target = node.Target;                TreeNode chiledNode = CreatTreeNode(content, next_code, url, image, target);
                    CreateFileTree(next_code, chiledNode);//递归创建各层节点
                    AddTree(Node, chiledNode);//将子节点加入到父节点中
                }
            }        /// <summary>
            /// 创建一个树节点,返回一个树节点对象,参数内容是:
            /// 节点名称,节点ID,链接地址,正常图标,展开后的图标
            /// </summary>
            private  TreeNode CreatTreeNode(string strText, string strId, string strUrl, string strImg,string strTarget)
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = strText;
                newNode.Value = strId;
                newNode.NavigateUrl = strUrl;
                newNode.ImageUrl = strImg;
                newNode.Target = strTarget;
                return newNode;
            }        /// <summary>
            /// 把子节点添加到父节点当中
            /// </summary>
            private  void  AddTree(TreeNode FatherNode, TreeNode ChildNode)
            {
                FatherNode.ChildNodes.Add(ChildNode);
            }
      

  5.   

    那种点击后节点再绘制所有子节点的做法也不好,如果有5000个子节点呢?
    如果winform,首选的是增量查询和渲染树结构,而不是一次性绘制,
    详细的解释请看:
    http://topic.csdn.net/u/20110707/11/f8f27ef3-f401-433a-ba7e-01ed2975ef4d.html请注意我在60和62楼的回复,
    希望对楼主有帮助
      

  6.   

    我知道,但是加载的慢是什么问题啊 
    ,这是我的代码
    private void GetData(int parentid, TreeNode pnode)
      {
      DataSet ds = new DataSet();
      string sqlStr = string.Format("select * from functionlist where parentID=0");
      OleDbDataAdapter adp = new OleDbDataAdapter(sqlStr, oleConnection1);
      ds.Clear();
      adp.Fill(ds, "check");
      DataTable table = ds.Tables[0];
      foreach (DataRow dr in table.Rows)
      {
      TreeNode node = new TreeNode();
      node.Name = dr["id"].ToString();
      node.Tag = "0";
      node.Text = dr["CN"].ToString();
      treeView1.Nodes.Add(node);
      CreateTree(node);
      }
      }
      private void CreateTree(TreeNode treeNode)
      { //name id; tag parentID
      //查找子节点
      DataSet ds = new DataSet();
      string sqlStr = string.Format("select * from functionlist where parentID={0}", treeNode.Name);
      OleDbDataAdapter adp = new OleDbDataAdapter(sqlStr, oleConnection1);
      ds.Clear();
      adp.Fill(ds);
      DataTable table = ds.Tables[0];
      if (table.Rows.Count > 0)
      {
      foreach (DataRow dr in table.Rows)
      {
      TreeNode node = new TreeNode();
      node.Name = dr["id"].ToString();
      node.Tag = dr["parentID"].ToString();
      node.Text = dr["CN"].ToString();
      treeNode.Nodes.Add(node);
      CreateTree(node);
      }
      

  7.   

    其实微软是很好的老师,
    你打开一个文件夹,在里面建20个空的文件夹,全选,复制,
    重复复制个几千个,
    你看看微软是怎么做的,当时就有答案了增量查询+动态绘制微软十几年前就给我们示范了,
    程序员天天用windows.sqlserver这些工具,这些手段早就不是什么新鲜货了
      

  8.   

    sqlserver提供的企业管理器或者ssms(管理中心)
    你打开一个上万条记录的数据表或者结果集,
    当你把滚动条拖到底部的时候,
    也可以看到微软是怎么处理的
      

  9.   

      不明白要怎么做我的是ACCESS数据库