当前位置: 代码迷 >> C# >> C#无限级树形菜单解决方案
  详细解决方案

C#无限级树形菜单解决方案

热度:97   发布时间:2016-05-05 02:37:04.0
C#无限级树形菜单
cdepcode   bdepend         cdepname              depgrade    
部门编号   是否末级    部门名称         级次
10 False 临床服务类科室 1
30200001 True 120车队            4
1002 False 全科医疗科            2
1003 False 内科            2
100301 False 呼吸内科            3
10030101 True 呼吸内科门诊 4
10030102 True 呼吸内科病房 4
100302 False 消化内科            3
10030201 True 消化内科门诊 4
10030202 True 消化内科病房 4
100303 False 神经康复科            3
10030301 True 神经内科门诊 4
20250001 True 体检中心            4
20260001 True 放疗科病房           4
2027 True 临床医学转化实验室 2
10030502 True 血液内科病房 4
100306 False 肾病学科            3
10030602 True 肾病学科病房 4
10030701 True 内分泌科门诊 4
100308 False 免疫学科             3
10030801 True 免疫学科门诊 4
100309 False 变态反应科             3


求无限级的树形菜单绑定方法?
------解决思路----------------------
什么叫无限级,, 百度递归吧。
------解决思路----------------------
请进行 递归
------解决思路----------------------
数据库表做成这样
ID                              PID                             departmentname
编号                        父级部门编号              部门名称



然后递归就行了,非常方便的
------解决思路----------------------
我以前写的无限分类树(treeview实现)的主要代码,你一看应该就能明白

       public void tv_bind()
        {
            try
            {
                //从数据库中读取分类信息至DataSet
                //绑定前先清空数据集
                ds.Clear();
                treeView1.Nodes.Clear();
                ds=getdata.getds("select * from tree order by orderid desc,id asc","tree");
                //如果数据库中有信息那么构造树,否则提示无接点
                if (ds.Tables["tree"].Rows.Count > 0)
                {
                    //清除树节点,从根添加树
                    treeView1.Nodes.Clear();
                    Add_tree(0, (TreeNode)null);
                }
                else
                {
                    treeView1.Nodes.Clear();
                    TreeNode node = new TreeNode();
                    node.Text = "暂无任何分类信息";
                    treeView1.Nodes.Add(node);
                }

            }
            catch
            {
                treeView1.Nodes.Clear();
                TreeNode node = new TreeNode();
                node.Text = "暂无任何分类信息:请检查数据库连接是否正常";
                treeView1.Nodes.Add(node);
            }
            //标记树的状态为展开,展开树
            //isexpand = true;
            //treeView1.ExpandAll();
        }

        //递归树
        private void Add_tree(int pid, TreeNode pnode)
        {
            DataRow[] dr = ds.Tables["tree"].Select("pid=" + pid);
            foreach (DataRow row in dr)
            {
                TreeNode node = new TreeNode();
                if (pnode == null)
                {
                    node.Text = row["nodename"].ToString();
                    node.Tag = row["id"].ToString();
                    node.ToolTipText = row["notes"].ToString();
                    treeView1.Nodes.Add(node);
                    Add_tree(int.Parse(row["id"].ToString()), node);
                }
                else
                {
                    node.Text = row["nodename"].ToString();
                    node.Tag = row["id"].ToString();
                    node.ToolTipText = row["notes"].ToString();
                    pnode.Nodes.Add(node);
                    Add_tree(int.Parse(row["id"].ToString()), node);
                }
            }
        }


------解决思路----------------------
建议不要一次性全部绑定,根据用户点开用递归逐级加载。
------解决思路----------------------
http://blog.csdn.net/xianfajushi/article/details/7756584
------解决思路----------------------
动态显示树形列表菜单
 public void GetCavernMenu(TreeNode newNodeA, ToolStripDropDownItem newmenuA, bool BL)
        {
            bool Var_Bool = true;
            if (newmenuA.HasDropDownItems && newmenuA.DropDownItems.Count > 0)
                for (int j = 0; j < newmenuA.DropDownItems.Count; j++)    //遍历二级菜单项
                {
                    //将二级菜单名称添加到TreeView组件的子节点newNode1中,并设置当前节点的子节点newNode2
                    TreeNode newNodeB = newNodeA.Nodes.Add(newmenuA.DropDownItems[j].Text);
                    Var_Bool = true;
                    if (BL == false)//判断当前命令项的上一级命令是否可用
                    {
                        newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色
                        newNodeB.Tag = 0;//标识,不显示相应的窗体
                        Var_Bool = false;
                    }
                    else
                    {
                        if (newmenuA.DropDownItems[j].Enabled == false)//判断当前命令项是否为可用
                        {
                            newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色
                            newNodeB.Tag = 0;//标识,不显示相应的窗体
                            Var_Bool = false;
                        }
                        else
                        {
                            newNodeA.ForeColor = Color.Black;//设置当前命令项的字体颜色为可用色
                            newNodeB.Tag = int.Parse(newmenuA.DropDownItems[j].Tag.ToString());//标识,显示相应的窗体
                        }
                    }
                    //将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中
                    ToolStripDropDownItem newmenuB = (ToolStripDropDownItem)newmenuA.DropDownItems[j];
                    if (newmenuB.HasDropDownItems && newmenuA.DropDownItems.Count > 0)//如果当前命令项有子项
                    {
                        newNodeB.Tag = 0;//标识,有子项的命令项
                        GetCavernMenu(newNodeB, newmenuB, Var_Bool);//调用递归方法
                    }
                }
        }

------解决思路----------------------
http://goobbe.com/questions/3899144/tree-data-structure-in-c-sharp
  相关解决方案