如何动态加载一个上百万条数据的树型菜单!

时间:2020-12-06 12:01:14
我现在在用weblogic的页面流开发一个数据的树型菜单显示,格式如下:
根节点
    节点a
      a1
      a2
      ...
   节点b
      b1
      b2
      ...
用其自身的netui:tree标签可以一次性取出来,但因为数据太多,一次性取出所有太耗内存了,速度也太慢!!
所以想实现点击"节点a"才动态加载其子节点a1,a2.....,找了好多树型例子,都是一次性加载的!
有没有能动态加载的,请大家帮忙哈!很急!谢谢

19 个解决方案

#1


自己顶!希望大家帮个忙哈。。。。。。

#2


csdn那个左边的你自己down呀!那不现成的么?

#3


楼上的兄弟,我分不够,你有么?发我一份好不好!十分感谢!

#4



//得到树节点的路径
        private string getNodePath(TreeNode tn) { 
            if ( tn.Parent == null){
                return tn.Text;
            }
            return getNodePath(tn.Parent) + "\\" + tn.Text;
        }

        //为节点添加子节点       
        private void AddNode(TreeNode tn, bool isRoot)
        {
            try
            {
                //得到选择路径
                string strPath = "";
                strPath = getNodePath(tn);
                //得到该路径的信息
                DirectoryInfo dti = new DirectoryInfo(strPath);
                DirectoryInfo[] objdti = dti.GetDirectories();
                //为节点添加下级节点
                for (int i = 0; i < objdti.Length; i++)
                {
                    TreeNode objtn = new TreeNode(objdti[i].ToString());
                    objtn.ImageIndex = 1;//====
                    objtn.SelectedImageIndex = 1; //========                   
                    tn.Nodes.Add(objtn);
                }
            }
            catch
            {
            }
        }
        //
        private void Ziyuan_Load(object sender, EventArgs e)
        {
            string[] str = System.Environment.GetLogicalDrives();
            for (int i = 0; i < str.Length; i++) {
                TreeNode node = new TreeNode(str[i].ToString());
                this.tvwTree.Nodes.Add(node);
                AddNode(node,false);
            }
            
            lvwList.Columns.Add("文件",150,HorizontalAlignment.Left);
            lvwList.Columns.Add("大小", 80, HorizontalAlignment.Right);
            lvwList.Columns.Add("时间", 120, HorizontalAlignment.Right);
            lvwList.View = View.Details;
            //设置图片
            this.tvwTree.ImageList = img;           
        }
        //展开节点事件
        private void tvwTree_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            //得到当前选择的节点
            //TreeNode tn = (TreeNode)e.Node;
            TreeNode tn = tvwTree.SelectedNode;
            for (int i = 0; i < tn.Nodes.Count; i++) {
                AddNode(tn.Nodes[i],false);
            }
        }
        //收起节点事件
        private void tvwTree_AfterCollapse(object sender, TreeViewEventArgs e)
        {
            //得到当前选择的节点
            //TreeNode tn = (TreeNode)e.Node;
            TreeNode tn = tvwTree.SelectedNode;
            for (int i = 0; i < tn.Nodes.Count; i++) { 
                //清除下一级节点
                tn.Nodes[i].Nodes.Clear();
            }
          
        }
        //当选择一个节点事件
        private void tvwTree_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                //得到当前所选择的节点
                TreeNode tn = tvwTree.SelectedNode;
                //得到该节点所在路径
                string strPath = getNodePath(tn);
                //得到给节点下的所有子文件夹
                DirectoryInfo dtif = new DirectoryInfo(strPath);
                FileInfo[] fi = dtif.GetFiles();
                //清空列表框中原来的内容
                lvwList.Items.Clear();
                //将每一个文件的信息显示到列表框中来
                foreach (FileInfo file in fi){
                    ListViewItem lvwItem = new ListViewItem();
                    lvwList.SmallImageList = img;
                    lvwItem.ImageIndex = 1;

                    //得到文件名
                    lvwItem.SubItems[0].Text = file.Name;
                    string str = file.Name;                    
                    string[] st = str.Split('.');
                    string txt = st[st.Length - 1];
                    Regex rg = new Regex(txt, RegexOptions.IgnoreCase);
                    if (rg.IsMatch("txt"))
                    {
                        setImg(6, lvwItem);
                    }
                                        //得到文件的大小
                    lvwItem.SubItems.Add(file.Length.ToString() + "字节");
                    //得到文件的修改时间
                    lvwItem.SubItems.Add(file.LastAccessTime.ToLocalTime().ToString());
                    //添加到列表框
                    lvwList.Items.Add(lvwItem);
                }
            }
            catch {
                return;
            }
        }

这是我在学winForm 时 做的资源管理器
做得不怎么样,但是我可以谈谈我的思想:
首先,你得构造你的根节点。
然后,当你点击某个根节点时,
你要根据你的根节点查询,该节点下的所有子节点。
如果,某个子节点还有子节点。则显示+号,表示还有子节点。
那么该子节点,又是下面的根节点了。
同此循环调用。不要一下查询所有的节点,那样会死机的。
就是点一下,就显示所有的下级目录。
点击触发。
这就是我的小经验。
希望对兄弟你有 帮助,哥们够意思吧
^_*

#5


帮顶,学习学习!!

#6


谢谢IBM_hoojo!我用的是weblogic页面流开发的,资料太少了,找了好多都没这方面的,菜单树以前也用多dtree树,但加载的数据都很少!没这样的要加载几百万的数据,头疼啊!希望有兄弟能发Java,jsp方面的代码参考参考!说真的,对js不是很熟悉......

#7


当点击一个节点的时候,就去查他的子节点啊,先别考虑树形,就当下拉列表框用

#8


页面加载时就只读一级节点,然后点到一个节点时再去查他的子节点,然后添加到点的这个节点下!
大概算法就是这样了!

#9


顶.

#10


自己再顶一下啦,我有点纳闷有人做过这样的树型数据展示么?这样的需求确认让人很郁闷!

#11


太多了吧..一百万条..我一般做树都 是用dtree

#12


我改了一个dtree用ajax实现的,加载页面只加载一个根结点,然后根据父亲结点找到儿子结点。要是需要就联系我

#13


ajax

#14


4楼的顶起你。

#15


我现在能做到根节点下第一级节点的动态显示,也就是我第一次加载只加载“节点a”,“节点b",然后点击"节点a"后再动态加载其子节点,但还是不能任意显示子节点,我用的是标签!不知道还有没有好的办法

#16


几百万条的树形菜单有点牛,从没遇到过..

#17


几百万条的树形菜单~~~ 嘿嘿~~你死定了

#18


呵呵,这么多数据就是一条数据一个信息,估计客户端也受不了。

#19


ext 框架的treepanel是异步刷新的 ,这个很好用   
如果不想用ext,用ajax把dtree改改也行 

#1


自己顶!希望大家帮个忙哈。。。。。。

#2


csdn那个左边的你自己down呀!那不现成的么?

#3


楼上的兄弟,我分不够,你有么?发我一份好不好!十分感谢!

#4



//得到树节点的路径
        private string getNodePath(TreeNode tn) { 
            if ( tn.Parent == null){
                return tn.Text;
            }
            return getNodePath(tn.Parent) + "\\" + tn.Text;
        }

        //为节点添加子节点       
        private void AddNode(TreeNode tn, bool isRoot)
        {
            try
            {
                //得到选择路径
                string strPath = "";
                strPath = getNodePath(tn);
                //得到该路径的信息
                DirectoryInfo dti = new DirectoryInfo(strPath);
                DirectoryInfo[] objdti = dti.GetDirectories();
                //为节点添加下级节点
                for (int i = 0; i < objdti.Length; i++)
                {
                    TreeNode objtn = new TreeNode(objdti[i].ToString());
                    objtn.ImageIndex = 1;//====
                    objtn.SelectedImageIndex = 1; //========                   
                    tn.Nodes.Add(objtn);
                }
            }
            catch
            {
            }
        }
        //
        private void Ziyuan_Load(object sender, EventArgs e)
        {
            string[] str = System.Environment.GetLogicalDrives();
            for (int i = 0; i < str.Length; i++) {
                TreeNode node = new TreeNode(str[i].ToString());
                this.tvwTree.Nodes.Add(node);
                AddNode(node,false);
            }
            
            lvwList.Columns.Add("文件",150,HorizontalAlignment.Left);
            lvwList.Columns.Add("大小", 80, HorizontalAlignment.Right);
            lvwList.Columns.Add("时间", 120, HorizontalAlignment.Right);
            lvwList.View = View.Details;
            //设置图片
            this.tvwTree.ImageList = img;           
        }
        //展开节点事件
        private void tvwTree_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            //得到当前选择的节点
            //TreeNode tn = (TreeNode)e.Node;
            TreeNode tn = tvwTree.SelectedNode;
            for (int i = 0; i < tn.Nodes.Count; i++) {
                AddNode(tn.Nodes[i],false);
            }
        }
        //收起节点事件
        private void tvwTree_AfterCollapse(object sender, TreeViewEventArgs e)
        {
            //得到当前选择的节点
            //TreeNode tn = (TreeNode)e.Node;
            TreeNode tn = tvwTree.SelectedNode;
            for (int i = 0; i < tn.Nodes.Count; i++) { 
                //清除下一级节点
                tn.Nodes[i].Nodes.Clear();
            }
          
        }
        //当选择一个节点事件
        private void tvwTree_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                //得到当前所选择的节点
                TreeNode tn = tvwTree.SelectedNode;
                //得到该节点所在路径
                string strPath = getNodePath(tn);
                //得到给节点下的所有子文件夹
                DirectoryInfo dtif = new DirectoryInfo(strPath);
                FileInfo[] fi = dtif.GetFiles();
                //清空列表框中原来的内容
                lvwList.Items.Clear();
                //将每一个文件的信息显示到列表框中来
                foreach (FileInfo file in fi){
                    ListViewItem lvwItem = new ListViewItem();
                    lvwList.SmallImageList = img;
                    lvwItem.ImageIndex = 1;

                    //得到文件名
                    lvwItem.SubItems[0].Text = file.Name;
                    string str = file.Name;                    
                    string[] st = str.Split('.');
                    string txt = st[st.Length - 1];
                    Regex rg = new Regex(txt, RegexOptions.IgnoreCase);
                    if (rg.IsMatch("txt"))
                    {
                        setImg(6, lvwItem);
                    }
                                        //得到文件的大小
                    lvwItem.SubItems.Add(file.Length.ToString() + "字节");
                    //得到文件的修改时间
                    lvwItem.SubItems.Add(file.LastAccessTime.ToLocalTime().ToString());
                    //添加到列表框
                    lvwList.Items.Add(lvwItem);
                }
            }
            catch {
                return;
            }
        }

这是我在学winForm 时 做的资源管理器
做得不怎么样,但是我可以谈谈我的思想:
首先,你得构造你的根节点。
然后,当你点击某个根节点时,
你要根据你的根节点查询,该节点下的所有子节点。
如果,某个子节点还有子节点。则显示+号,表示还有子节点。
那么该子节点,又是下面的根节点了。
同此循环调用。不要一下查询所有的节点,那样会死机的。
就是点一下,就显示所有的下级目录。
点击触发。
这就是我的小经验。
希望对兄弟你有 帮助,哥们够意思吧
^_*

#5


帮顶,学习学习!!

#6


谢谢IBM_hoojo!我用的是weblogic页面流开发的,资料太少了,找了好多都没这方面的,菜单树以前也用多dtree树,但加载的数据都很少!没这样的要加载几百万的数据,头疼啊!希望有兄弟能发Java,jsp方面的代码参考参考!说真的,对js不是很熟悉......

#7


当点击一个节点的时候,就去查他的子节点啊,先别考虑树形,就当下拉列表框用

#8


页面加载时就只读一级节点,然后点到一个节点时再去查他的子节点,然后添加到点的这个节点下!
大概算法就是这样了!

#9


顶.

#10


自己再顶一下啦,我有点纳闷有人做过这样的树型数据展示么?这样的需求确认让人很郁闷!

#11


太多了吧..一百万条..我一般做树都 是用dtree

#12


我改了一个dtree用ajax实现的,加载页面只加载一个根结点,然后根据父亲结点找到儿子结点。要是需要就联系我

#13


ajax

#14


4楼的顶起你。

#15


我现在能做到根节点下第一级节点的动态显示,也就是我第一次加载只加载“节点a”,“节点b",然后点击"节点a"后再动态加载其子节点,但还是不能任意显示子节点,我用的是标签!不知道还有没有好的办法

#16


几百万条的树形菜单有点牛,从没遇到过..

#17


几百万条的树形菜单~~~ 嘿嘿~~你死定了

#18


呵呵,这么多数据就是一条数据一个信息,估计客户端也受不了。

#19


ext 框架的treepanel是异步刷新的 ,这个很好用   
如果不想用ext,用ajax把dtree改改也行 

#20