各位老大,我的问题如题,动态生成树型菜单,无限级的,可以在任何级别的菜单下增加新菜单,并可对子菜单进行增删改,万分感谢!!!!

解决方案 »

  1.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    // Put user code to initialize the page here
    if (IsPostBack==false)
    {
    this.sqlDataAdapter1.Fill(this.dataSet11);
    TreeNode rootNode=new TreeNode();
    AddTree(1,null);

    }
    }// 递归添加树的节点
    public void AddTree(int ParentID, TreeNode pNode) 
    {
    // DataSet ds=(DataSet) this.ViewState["ds"]; 
    DataView dvTree = new DataView(this.dataSet11.Tables[1]);
    //过滤ParentID,得到当前所有子节点
    dvTree.RowFilter =  "[PARENTID] = " + ParentID; foreach(DataRowView Row in dvTree) 
    {
    TreeNode Node=new TreeNode() ;
    if(pNode == null) 
    {    //添加根节点
    TreeView1.Nodes.Add(Node);
    Node.Expanded = false;

    else 
    {   //添加当前节点的子节点
    pNode.Nodes.Add(Node);
    Node.Expanded = false;
    } Node.Text = Row["context"].ToString();
    AddTree(Int32.Parse(Row["id"].ToString()), Node);//递归
    Node.Target = "frright";
    Node.NavigateUrl = Row["depth"].ToString();
    Node.ImageUrl = Row["image"].ToString() ;
    Node.ExpandedImageUrl = Row["image"].ToString();
    }                   
    }
      

  2.   

    public System.Windows.Forms.TreeNode FillTreeView(string RootName,string Sql,string TableName,
    string TextFiledName,string TagFiledName)
    {
    System.Windows.Forms.TreeNode Node = new System.Windows.Forms.TreeNode();
    Node.Text = RootName;
    Node.Tag = 0;
    Node.Checked = true; Common.SQLTransfer.FillDataSet(ds,TableName,Common.GlobalData.ConnStr,System.Data.CommandType.Text,Sql);
    int Count = ds.Tables[TableName].Rows.Count;

    for ( int i = 0; i < Count; i ++ )
    {
    System.Windows.Forms.TreeNode LeafNode = new System.Windows.Forms.TreeNode();
    LeafNode.Text = ds.Tables[TableName].Rows[i][TextFiledName].ToString();
    LeafNode.Tag = int.Parse(ds.Tables[TableName].Rows[i][TagFiledName].ToString());
    LeafNode.Checked = false;
    LeafNode.Nodes.Add("test");
    Node.Nodes.Add(LeafNode);
    }
    return Node;
    }
    前提是数据库中字段标识时候为根节点和父节点
      

  3.   

    各位老大,其实我要实现的是多级别的新闻类别管理。让类别树形显示,点中任何一个类别,可对他的名称进行修改、删除该类别及下属的子类别并删除响应的类别新闻;并添加它的子类别。我的表结构这样设置的
    id    title    level    rootid 
    其中title是类别名称
    level是目录的级别
    rootid 是从属于父级的id和自身的id
    比如
    1   最新新闻   1    1
    2   热点新闻   1    2
    3   玉米       2    1,3
    记录id=3的是从属于“最新新闻”它的级别是2级菜单,所以level=2  rootid=1,3
      

  4.   

    两个字段表示层次,然后递归输出树。
    比如ID,ParID,ID为自增字段,ParID为父节点字段,如果ParID为0(设置默认为0)则为最高一层节点,可以说是根节点,然后把ID的某一个值赋给ParID,作为其子节点,这样就可以实现无限级别镶套。至于输出,写一个递归就可以全搞定。
      

  5.   

    Level字段纯属画蛇。
    ID,ParID
    1,0
    2,1
    3,2
    4,3
    5,3
    1
    --2
    ----3
    ------4
    ------5
    你的要求不是全出来了吗?
      

  6.   

    level采用广度遍历树的时候,效率应该是最高的
      

  7.   

    看我的3段任意分类管理法:SortID    SortName   SortDescription PrasentsSortID分类编号  分类名字   分类说明        分类父类 private void UpdateSortTreeView(int SortID,TreeNodeCollection tnc)
    {
    string sql=null;
    try
    {
    if(0==SortID)
    sql="select * from Sorts where ParentsSortID is null";
    else
    sql="select * from Sorts where ParentsSortID="+SortID.ToString();
    if(ConnectionState.Open!=myConn.State)
    {
    myConn.ConnectionString=DBInfo.ConnStr;
    myConn.Open();
    } SqlDataAdapter myAdapter=new SqlDataAdapter(sql,myConn);
    DataSet myDs=new DataSet();

    myAdapter.Fill(myDs,"SortInfo");
    if(null!=myDs)
    for(int i=0;i<myDs.Tables["SortInfo"].Rows.Count;i++)
    {
    tnc.Add(myDs.Tables["SortInfo"].Rows[i][1].ToString().Trim());
    tnc[tnc.Count-1].Tag=myDs.Tables["SortInfo"].Rows[i][0].ToString();
    int k=int.Parse(myDs.Tables["SortInfo"].Rows[i][0].ToString());
    if(CheckNullSort(k))
    UpdateSortTreeView(k,tnc[i].Nodes);
    }
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    if(0==SortTreeView.Nodes.Count)
    {
    btnSortProperty.Enabled=false;
    btnSortEdit.Enabled=false;
    btnSortDel.Enabled=false;
    }
    else
    {
    btnSortEdit.Enabled=true;
    btnSortDel.Enabled=true;
    }
    } private bool CheckNullSort(int SortID)
    {
    string sql=null;
    try
    {
    if(ConnectionState.Open!=myConn.State)
    {
    myConn.ConnectionString=DBInfo.ConnStr;
    myConn.Open();
    }
    sql="select count(*) from Sorts where ParentsSortID="+SortID.ToString();
    SqlDataAdapter chkAdapter=new SqlDataAdapter(sql,myConn);
    DataSet chkDs=new DataSet();
    chkAdapter.Fill(chkDs,"chkClass");
    if(int.Parse(chkDs.Tables["chkClass"].Rows[0][0].ToString())>0)
    return true;
    else
    return false;
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.Message);
    return false;
    }
    } private void SortManageFrm_Load(object sender, System.EventArgs e)
    {
    UpdateSortTreeView(0,SortTreeView.Nodes);
    } private void DeleteSort(int SortID)
    {
    string sql=null;
    try
    {
    if(ConnectionState.Open!=myConn.State)
    {
    myConn.ConnectionString=DBInfo.ConnStr;
    myConn.Open();
    }
    if(CheckNullSort(SortID))
    {
    sql="select * from sorts where parentssortid="+SortID.ToString();
    SqlDataAdapter myAdapter=new SqlDataAdapter(sql,myConn);
    DataSet myDs=new DataSet();
    myAdapter.Fill(myDs,"SortInfo");
    if(null!=myDs)
    for(int i=0;i<myDs.Tables["SortInfo"].Rows.Count;i++)
    {
    DeleteSort(int.Parse(myDs.Tables["SortInfo"].Rows[i][0].ToString()));
    }
    }
    sql="delete from Sorts where SortID="+SortID.ToString();
    SqlCommand exeCmd=new SqlCommand(sql,myConn);
    exeCmd.ExecuteNonQuery();
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    } private void btnSortDel_Click(object sender, System.EventArgs e)
    {
    if(null!=SortTreeView.SelectedNode)
    {
    if(DialogResult.Yes==MessageBox.Show("是否要删除此分类?","确认删除分类",MessageBoxButtons.YesNo,MessageBoxIcon.Question))
    {
    DeleteSort(int.Parse(SortTreeView.SelectedNode.Tag.ToString()));
    SortTreeView.Nodes.Clear();
    UpdateSortTreeView(0,SortTreeView.Nodes);
    }
    }
    else
    MessageBox.Show("请选择您要删除的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    } private void btnSortAdd_Click(object sender, System.EventArgs e)
    {
    if(null!=SortTreeView.SelectedNode)
    {
    if(SortTreeView.Nodes.Count>0)
    {
    AddSortFrm myAdd=new AddSortFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),"添加"+SortTreeView.SelectedNode.Text+"分类");
    myAdd.ShowDialog();
    }
    else
    {
    AddSortFrm myAdd=new AddSortFrm(0,"添加分类");
    myAdd.ShowDialog();
    }
    }
    else
    {
    AddSortFrm myAdd=new AddSortFrm(0,"添加分类");
    myAdd.ShowDialog();
    }
    SortTreeView.Nodes.Clear();
    UpdateSortTreeView(0,SortTreeView.Nodes);
    } private void SortTreeView_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
    if(0==SortTreeView.SelectedNode.Nodes.Count)
    btnSortProperty.Enabled=true;
    else
    btnSortProperty.Enabled=false;
    } private void btnSortEdit_Click(object sender, System.EventArgs e)
    {
    if(null!=SortTreeView.SelectedNode)
    {
    ModifySortFrm myMod=new ModifySortFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),"修改"+SortTreeView.SelectedNode.Text+"分类");
    myMod.ShowDialog();
                    
    SortTreeView.Nodes.Clear();
    UpdateSortTreeView(0,SortTreeView.Nodes);
    }
    else
    MessageBox.Show("请选择您要修改的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    } private void btnSortProperty_Click(object sender, System.EventArgs e)
    {
    if(null!=SortTreeView.SelectedNode)
    {
    SortPropertyFrm myProperty=new SortPropertyFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),SortTreeView.SelectedNode.Text);
    myProperty.ShowDialog();
    }
    else
    MessageBox.Show("请选择您要操作的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    } private void SortManageFrm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    myConn.Close();
    myConn.Dispose();
    }
    }
    }全部操作在此,慢慢看吧.....
      

  8.   

    我晕哦
    有这么麻烦么?
    一个递归就可以了,楼主的level字段在广度遍历时是可以提高效率的
      

  9.   

    hehe 楼主不但要显示数据
    还要添加,删除数据,好象人家不知道用递归一样,你看我上面的显示也是用的递归啊.....
      

  10.   

    id    title    level    rootid 
    其中title是类别名称
    level是目录的级别
    rootid 是从属于父级的id和自身的id
    比如
    1   最新新闻   1    1
    2   热点新闻   1    2
    3   玉米       2    1,3
    记录id=3的是从属于“最新新闻”它的级别是2级菜单,所以level=2  rootid=1,3如果是oracle数据库一个关键字就都出来了。
    select id, title from table_name start with rootid is null prior by id = rootid
      

  11.   

    不好意思上面的SQL打错了,正确的如下
    select id, lpad(title, lengthb(title)+4*(level-1), '*') title from table_name start with rootid is null connect by prior id = rootid
      

  12.   

    treeview
    或者用for 自己写也行
      

  13.   

    我这里有个asp.net做的网站样式的资源管理器能够满足你的要求你把邮箱给我  我发给你看看怎么样?
      

  14.   

    [email protected]
    免费的偶也要!嘿嘿……
      

  15.   

    我也想要。。谢谢
    [email protected]