能无限创建菜单,比如一个公司下面有N个分公司,分公司又可以有部门,部门又可以分工作组 工作组再分个人...  数据库设计表COMPANY(companyid,parentid,companyname....)
  
  哪位高手写个方法,实现以上的方法!

解决方案 »

  1.   

    public TreeNode GetTreeAndBind()
            {
                TreeNode o_RootNode = new TreeNode("全部");
                o_RootNode.Tag = "0";
                GetTreeNode(GetTreeView(m_sTableName), ref o_RootNode);
                return o_RootNode;
            }        //递归添加树的节点
            private void GetTreeNode(DataTable o_aDtTree, ref TreeNode o_aNode)
            {
                ///找出子节点
                string s_Filter = "";
                if (o_aNode.Tag.ToString() == "")
                    s_Filter = "Parent_ID is null";
                else if (o_aNode.Tag.ToString()=="0")
                    s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' ";
                    else
                    s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' ";            DataRow[] o_drTemp = o_aDtTree.Select(s_Filter);            //添加所有子节点
                for (int i = 0; i < o_drTemp.Length; i++)
                {
                    string s_Value = o_drTemp[i]["code"]+"|"+o_drTemp[i]["ID"].ToString();
                    string s_Name = o_drTemp[i]["Name"].ToString();
                    string s_Serial = o_drTemp[i]["serial"].ToString();
                    TreeNode o_ChildNode = new TreeNode();
                    o_ChildNode.Text = s_Name;
                    o_ChildNode.Name = s_Serial;
                    o_ChildNode.Tag = s_Value;
                    //用递归的方法绑定该节点的子节点
                    GetTreeNode(o_aDtTree, ref o_ChildNode);
                    o_aNode.Nodes.Add(o_ChildNode);
                }
                return;
            }
      

  2.   


     DataSet ds=new DataSet();
                  private void Form1_Load(object sender, System.EventArgs e)
                  {
                         // 定义数据库连接
                         SqlConnection CN = new SqlConnection();
                         try 
                         {
                                //初始化连接字符串
                                CN.ConnectionString= "data source=pmserver;initial catalog=Bench;persist security info=False;user id=sa;Password=sa;";
                                CN.Open();
                                //添加命令,从数据库中得到数据
                                SqlCommand sqlCmd= new SqlCommand();
                                sqlCmd.Connection = CN;
                                sqlCmd.CommandText = "select * from COMPANY";
                                sqlCmd.CommandType = CommandType.Text ;
                                SqlDataAdapter adp = new SqlDataAdapter(sqlCmd);
                                adp.Fill(ds);
                         }
                         catch (Exception ex)
                         {
                                throw (ex);   
                         }
                         finally 
                         {
                                CN.Close();
                         }
                         //调用递归函数,完成树形结构的生成
                         AddTree(0, (TreeNode)null);
                  }
     
                  // 递归添加树的节点
                  public void AddTree(int ParentID,TreeNode pNode) 
                  {
                         DataView dvTree = new DataView(ds.Tables[0]);
                         //过滤ParentID,得到当前的所有子节点
                         dvTree.RowFilter =  "[PARENTID] = " + ParentID;
                         foreach(DataRowView Row in dvTree) 
                         {
                                if(pNode == null) 
                                {    //'̀添加根节点
                                       TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
                                       AddTree(Int32.Parse(Row["ID"].ToString()),Node);    //再次递归
                                } 
                                else 
                                {   //添加当前节点的子节点
                                       TreeNode Node =  pNode.Nodes.Add(Row["ConText"].ToString());
                                       AddTree(Int32.Parse(Row["ID"].ToString()),Node);     //再次递归
                                }
                         }                   
                  }            
     
      

  3.   

    如果你的数据源不是DataSet,是集合的话可以参考我现在用的这个: void BindTree(TreeView tv, DataCollection<PurviewSDO> modules)
            {
                DataCollection<PurviewSDO> roots = modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID==obj.PurviewID; });
                if (roots != null && roots.Count > 0)
                {
                    roots.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); }));
                    TreeNodeCollection nodes = tv.Nodes;                tv.BeginUpdate();
                    nodes.Clear();                foreach (PurviewSDO item in roots)
                    {
                        TreeNode sNode = new TreeNode();
                        sNode.Text = item.PurviewName;
                        sNode.Tag = item;                    if (item.FPurviewID == item.PurviewID)
                        {
                            sNode.ImageKey = "folder";
                            sNode.SelectedImageKey = "folder";
                        }                    BindNode(sNode, item);                    nodes.Add(sNode);                }
                    tv.EndUpdate();                if (nodes.Count > 0)
                    {
                        nodes[0].ExpandAll();
                    }
                }        }        void BindNode(TreeNode node,PurviewSDO module)
            {
               // Func<PurviewSDO, bool> FindAll = i => i.FPurviewID == module.PurviewID && i.PurviewID != module.PurviewID;
                //DataCollection<PurviewSDO> subModules = (modules.Where(FindAll)) as DataCollection<PurviewSDO>;            DataCollection<PurviewSDO> subModules =modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID == module.PurviewID && obj.PurviewID != module.PurviewID; });
                if (subModules != null && subModules.Count > 0)
                {
                    subModules.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); }));
                    foreach (PurviewSDO item in subModules)
                    {
                        TreeNode sNode = new TreeNode();
                        sNode.Text = item.PurviewName;
                        sNode.Tag = item;                    if (item.FPurviewID == module.PurviewID && item.PurviewID != module.PurviewID)
                        {
                            sNode.ImageKey = "action";
                            sNode.SelectedImageKey = "action";
                        }
                        BindNode(sNode, item);
                        node.Nodes.Add(sNode);
                    }
                }
     
            }
      

  4.   


            private void Form1_Load(object sender, EventArgs e)
            {
                bindtree(treeView1.Nodes, "0");
            }        private void bindtree(TreeNodeCollection Nds, string depid)
            {
                DbClass dbclass = new DbClass();
                DataSet ds = new DataSet();
                ds = dbclass.GetDataSet("select * from COMPANY", "COMPANY");
                DataView dv = ds.Tables["COMPANY"].DefaultView;
                dv.RowFilter = "parentid='" + companyid+ "'";
                TreeNode tn;
                string strparentid;
                foreach (DataRowView dr in dv)
                {
                    strparentid= dr["companyid"].ToString();
                    if (strparentid!= "0")
                    {
                        tn = new TreeNode();
                        tn.Name = dr["companyid"].ToString();
                        tn.Text = dr["companyname"].ToString();
                        Nds.Add(tn);
                        bindtree(Nds[Nds.Count - 1].Nodes, strparentid);
                    }
                }
            }
      

  5.   

    先不帖代码了,我一般用两种方法,
    一个是递归,优点是简单,缺点是数据量大了就速度慢
    id  parentid  text
    1   0         总公司
    2   1         海南分公司
    3   1         北京分公司
    4   2         海南分公司IT部

    另一个方法是不用递归无深度(用友存货档就是这样做的),这种方法速度快,缺点就是两个表
    InventoryClass:
    cInvCCode      cInvCName iInvCGrade bInvCEnd
    10 原材料 1 1
    20 半成品 1 1
    30 产成品 1 1 Inventory:
    cInvCode, cInvName, cInvStd, cInvCCode(与InventoryClass表对应)
    1001 贴片SDM4953 SDM4953 10
    1002 锗二极管 D21DQ锗二极管 10
    2001 RV2.5电源线红黑60cm-A HZ-4P 20
    2002 单元板20P压线10cm 20
    3001 双色5058 32x80-1(无点阵) M17200R1G1-32X80-V1/16-A1-0 30Inventory表的cInvCode字段的前N位就是它所属上一级类别/2的编码
    1007 电阻560欧-1/8W-5 R560欧-1/8W-5 10
    1008 二极管IN4148 D1N4148 10