根据数据库的内容生成treeview菜单,有层次

解决方案 »

  1.   

    递归问题
    假定tree为TreeView控件,data为数据表(id, pid, name分别为ID、父ID,名称)
    private void BuildTree(TreeNode tn)
    {
    int i;
    // 空节点时创建根节点,父ID为0的当作根节点
    if(tn == null)
    {
    tree.Nodes.Clear();
    for(i = 0 ; i < data.Rows.Count ; i ++)
    {
    if(data.Rows[i]["pid"].ToString() == "0")
    {
    TreeNode tmp = new TreeNode(data.Rows[i]["name"].ToString());
    tmp.Tag = Int32.Parse(data.Rows[i]["id"].ToString());
    tree.Nodes.Add(tmp);
    }
    }
    // 循环递归创建树
    for(i = 0 ; i < tree.Nodes.Count ; i ++)
    {
    BuildTree(tree.Nodes[i]);
    }
    }
    else // 节点非空为递归调用
    {
    for(i = 0 ; i < data.Rows.Count ; i ++)
    {
    if(tn.Tag.ToString() == data.Rows[i]["pid"].ToString())
    {
    TreeNode tmp = new TreeNode(data.Rows[i]["name"].ToString());
    tmp.Tag = Int32.Parse(data.Rows[i]["id"].ToString());
    tn.Nodes.Add(tmp);
    }
    }
    for(i = 0 ; i < tn.Nodes.Count ; i ++)
    {
    BuildTree(tn.Nodes[i]);
    }
    }
    }调用:
    data = GetDataTable(...);
    BuildTree(null);
      

  2.   

    请问在数据库中,父treenode的功能码和子treeview功能码怎么定义比较好
      

  3.   

    参看
    http://blog.csdn.net/Knight94/archive/2006/05/01/704281.aspx
      

  4.   

    /// <summary>
    ///创建树
    /// </summary>
    /// <param name="ParentID">起始父节点</param>
    /// <param name="pNode">树对象</param>
    /// <param name="TitleName">标题字段名称</param>
    /// <param name="id">id字段名称</param>
    /// <param name="ParentId">ParentId字段名称</param>
    /// <param name="treeNode">返回树对象</param>
    /// <param name="ds">应用数据表</param>
    public static void CreateTree(int ParentID, TreeNode pNode, string id, string TitleName, string ParentId, ref TreeNode treeNode, DataTable dvTree)
            {
                foreach (DataRow Row in dvTree.Select("[" + ParentId + "] = '" + ParentID + "'"))
                {
                    TreeNode Node = new TreeNode();
                    if (pNode == null)
                    {    //添加根节点
                        Node.Text = Row[TitleName].ToString();
                        Node.Tag = Row[id].ToString();
                        treeNode.Nodes.Add(Node);
                        CreateTree(Int32.Parse(Row[id].ToString()), Node, id, TitleName, ParentId, ref treeNode, dvTree);    //再次递归
                    }
                    else
                    {   //添加当前节点的子节点
                        Node.Text = Row[TitleName].ToString();
                        Node.Tag = Row[id].ToString();
                        pNode.Nodes.Add(Node);
                        CreateTree(Int32.Parse(Row[id].ToString()), Node, id, TitleName, ParentId, ref treeNode, dvTree);     //再次递归
                    }
                }
            }
    数据表中只要有一个字段标示父id即可
      

  5.   

    //递归生成菜单
    private void CreatMenuItem()
    {
    OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\Menu.mdb;Persist Security Info=False;");
    OleDbCommand myComm = new OleDbCommand("SELECT nid,name,pid FROM Items ORDER BY pid,nid",myConn);
    OleDbDataAdapter myAda = new OleDbDataAdapter(myComm); 
    DataSet ds = new DataSet();
    myAda.Fill(ds,"MenuItemINfos");
    DataRow [] drs = ds.Tables["MenuItemINfos"].Select("pid = 0");
    int index = 0;
    foreach(DataRow dr in drs)
    {
    MenuItem mi =new MenuItem((string)dr["name"]);
    this.mainMenu1.MenuItems.Add(index++,mi);
    CreatBranch(mi,(int)dr["nid"],ds);
    }
    }
    private void CreatBranch(MenuItem parmt,int pid,DataSet ds)
    {
    int index = 0;
    foreach(DataRow dr in ds.Tables["MenuItemINfos"].Select("pid = "+pid))
    {
    MenuItem mi =new MenuItem((string)dr["name"]);
    parmt.MenuItems.Add(index++,mi);
    CreatBranch(mi,(int)dr["nid"],ds);
    }
    }
      

  6.   

    http://blog.csdn.net/duncansun/archive/2006/04/11/658784.aspx