数据库数据有240条数据,菜单深度是3级,生成树好慢,差不多要10s钟才能出现窗口看到树!,等待求解!....啥米情况?
        //递归生成树
        private void CreateNode(TreeNode tn, string parentid)
        {
            DB db = new DB();
            foreach (TreeInfo treeinfo in db.getList(parentid))
            {
                TreeNode tntemp = new TreeNode();
                tntemp.Text = treeinfo.MenuName;
                tntemp.ImageIndex = treeinfo.Icon;
                tntemp.SelectedImageIndex = treeinfo.Icon;
                string fatherMenuId = treeinfo.MenuId;
                CreateNode(tntemp, fatherMenuId);
                tn.Nodes.Add(tntemp);
            }
        }
        
        //加载窗体
        private void FrmMain_Load(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            TreeNode Node1 = new TreeNode("Root");
            treeView1.Nodes.Add(Node1);
            CreateNode(Node1, "10000");
        }        
        //数据库取值
         public List<TreeInfo> getList(string fatherMenuId)
        {
            List<TreeInfo> list = new List<TreeInfo>();            OleDbConnection oleDbConn = OpenConnection();            StringBuilder sb = new StringBuilder();
            if (fatherMenuId != "")
            {
                sb.Append("SELECT * FROM MenuTree WHERE FatherMenuId='" + fatherMenuId + "'");                OleDbCommand oleDbComm = new OleDbCommand(sb.ToString(), oleDbConn);
                OleDbDataReader oleDbReader = oleDbComm.ExecuteReader();                while (oleDbReader.Read())
                {
                    TreeInfo treeInfo = new TreeInfo();
                    treeInfo.MenuId = oleDbReader["MenuId"].ToString();
                    treeInfo.MenuName = oleDbReader["MenuName"].ToString();
                    treeInfo.Icon = Convert.ToInt32(oleDbReader["Icon"].ToString());
                    treeInfo.FatherMenuId = oleDbReader["FatherMenuId"].ToString();                    list.Add(treeInfo);
                }                oleDbConn.Close();
            }
            return list;
        }

解决方案 »

  1.   

    你这么干不慢才怪,每次创建节点,都要去数据库load一下吗
    foreach (TreeInfo treeinfo in db.getList(parentid))
    开始load一次就够了,后面就直接使用数据集,循环里面的item
      

  2.   


    直接用DataTabel取出来,然后再取?
      

  3.   

    表结构:
    CREATE TABLE MENUITEM
    (
      ITEMID        VARCHAR2(100 BYTE), //ID
      TEXT          VARCHAR2(100 BYTE),//树要显示的
      PARENTITEMID  VARCHAR2(100 BYTE),//父ID同ITEMID        
      FORMNAME      VARCHAR2(100 BYTE),//窗体名
      ISMODULE      VARCHAR2(100 BYTE),//是否还有子阶
      LEVELA        VARCHAR2(100 BYTE),//没用
      IMAGENAME     VARCHAR2(100 BYTE)//没用
    )生成树函数     
    _datatable为SQL查询出来返回的表.   public void Load_TreeView( int ParentID, TreeNode pNode)
            {
                DataView dvTree = _datatable.DefaultView;
                //过滤ParentID,得到当前的所有子节点 
                dvTree.RowFilter = "[PARENTITEMID] = " + ParentID;
                //ArrayList Document = new ArrayList();
                foreach (DataRowView Row in dvTree)
                {
                    if (pNode == null)
                    {
                        TreeNode Node = _treeview.Nodes.Add(Row["TEXT"].ToString());
                        Node.Name = Row["ITEMID"].ToString();
                        Load_TreeView(Int32.Parse(Row["ITEMID"].ToString()), Node); //再次递归 
                    }                else
                    { //添加当前节点的子节点 
                        TreeNode Node = pNode.Nodes.Add(Row["TEXT"].ToString());
                        Node.Name = Row["ITEMID"].ToString();
                        //Document.Add(new ListViewItem(Row["TEXT"].ToString(), 1));
                        //pNode.Tag = Document;                    Load_TreeView(Int32.Parse(Row["ITEMID"].ToString()), Node); //再次递归
                    }
                }
            }