本人用的是微软TreeView树形控件.现在在项目中遇到两个树状问题.问题1:我想做一个企业的结构,例:动态新增一个部门.这个部门有可能是三级或四级....N级目录下.问题2:想做一个部门和用户相关联的树形结构.例:生产部有张三,李四.财务部有王六,陈九...等.是能给出详细例子就最好不过了.(代码绑定,和数据结构的设计)感激不尽.

解决方案 »

  1.   

    //从根节点开始递归调用显示子树 ,DataOper是一个自写操作数据库的类,你也可也用SqlHelper
    private void InitTree(TreeNodeCollection Nds,string parentId)
    {
    DataView dv;
    TreeNode tmpNd;
    string intId;
    dv=DataOper.SqlDataView ("select * from s_menu");
    dv.RowFilter="ParentId='" + parentId+ "'" ;
    foreach(DataRowView drv in dv)
    {
    tmpNd=new TreeNode();
    tmpNd.ID=drv["NodeId"].ToString();
    tmpNd.Expanded=true;
    tmpNd.Text=drv["NodeName"].ToString();
    tmpNd.ImageUrl="webctrl_client/1_0/treeimages/"+drv["Icon"].ToString();
    tmpNd.NavigateUrl=drv["Address"].ToString();
    tmpNd.Target =drv["target"].ToString ();
    Nds.Add(tmpNd);
    intId=drv["ParentId"].ToString();
    InitTree(tmpNd.Nodes,tmpNd.ID);
    }
    dv.Dispose ();
    DataOper.CnClose ();
    }
      

  2.   

    xml+js+递归
    这种技术叫着无限级菜单
      

  3.   

    数据库:
    Nodeid   char(6)
    parentID char(6)
    NodeName char(20)
    Icon     char(20)
    Address  char(20)
    target   char(8)
      

  4.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data .SqlClient ;
    using Microsoft.Web .UI.WebControls ;namespace ReportTest
    {
    /// <summary>
    /// WebForm3 的摘要说明。
    /// </summary>
    public class WebForm3 : System.Web.UI.Page
    {
    protected System.Data.SqlClient.SqlConnection sqlConnection1;
    protected Microsoft.Web.UI.WebControls.TreeView TreeView1;private void Page_Load(object sender, System.EventArgs e)
    {
    if (!this.IsPostBack )
    {
    this.sqlConnection1 .Open ();
    // this.TreeView1 .ExpandLevel=2;this.ShowAllTree (0,this.sqlConnection1,this.TreeView1.Nodes) ;}
    }private TreeNodeCollection ShowAllTree(int ddd ,SqlConnection SqlConnection1,Microsoft.Web.UI.WebControls.TreeNodeCollection nodes)
    {stringsqlSelect =
    "SELECT parent_id , this_id,this_name FROM tree where parent_id='"+ddd+"'" ;SqlDataAdapter da = new SqlDataAdapter(sqlSelect, this.sqlConnection1);
    DataTable dt=new DataTable();
    da.Fill(dt);for(int i=0;i<dt.Rows.Count;i++)
    {
    TreeNode newNode=new TreeNode();
    DataRow dr=dt.Rows[i];
    newNode.Text= dr["this_name"].ToString();
    nodes.Add(newNode);int newID = Convert.ToInt32 (dt.Rows[i][1]);;ShowAllTree(newID,this.sqlConnection1 ,newNode.Nodes); //递归调用,将子结点ID当做下一当前结点ID}dt.Dispose();
    return nodes;
    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }/// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();
    //
    // sqlConnection1
    //
    this.sqlConnection1.ConnectionString = "workstation id=GW;packet size=4096;user id=sa;data source=GW;persist security inf" +
    "o=True;initial catalog=pubs;password=";
    this.Load += new System.EventHandler(this.Page_Load);}
    #endregion
    }
    }
    表结构create table tree(
    parent_id int not null,
    this_id int not null,
    this_name varchar(20) not null
    )
    insert into tree values(0,1,'第一个结点');
    insert into tree values(0,2,'第二个结点');
    insert into tree values(0,3,'第三个结点');
    insert into tree values(1,11,'结点1.1');
    insert into tree values(1,12,'结点1.2');
    insert into tree values(12,121,'结点121');
    insert into tree values(121,1211,'结点1211');
      

  5.   

    楼主应该先发挥主观能动性,和楼主讨论一下:
    private void fillTv(string strName)
    {
    string[] strTemp;
    int Length;
    string strQuery="select * from "+strName+" where RiverLevel = 0";
    gzsl.dataControl dc=new dataControl();
    string mRead=dc.getRead(strQuery,0);
    if(!(mRead==""))
    {
    strTemp=mRead.Split(new char[] {','});
    Length=strTemp.Length;
    for(int i=0;i<Length;i++)
    {
    Microsoft.Web.UI.WebControls.TreeNode tn=new Microsoft.Web.UI.WebControls.TreeNode();
    tn.Text=strTemp[i];
    tn.Expanded=true;
    // this.trShow.Nodes.Add(tn);
    this.trShow.Nodes.AddAt(0,tn);
    getChildren(tn,strName);
    }
    }
    } private void getChildren(Microsoft.Web.UI.WebControls.TreeNode trn,string strName)
    {
    string strFather=trn.Text.Trim();
    string strQuery="select * from "+strName+" where FatherRiver = '"+strFather+"'";
    string strRead="";
    string[] strTemp;
    gzsl.dataControl dc=new dataControl();
    strRead=dc.getRead(strQuery,0);
    if(!(strRead==""))
    {
    strTemp=strRead.Split(new char[] {','});
    for(int i=0;i<strTemp.Length;i++)
    {
    Microsoft.Web.UI.WebControls.TreeNode mTn=new Microsoft.Web.UI.WebControls.TreeNode();
    mTn.Text=strTemp[i];
    mTn.Expanded=true;
    trn.Nodes.AddAt(0,mTn);
    getChildren(mTn,strName);
    }
    } }
    数据库 sqlserver,表结构如下:
    名称 类型
    Name varchar
    RiverLevel int
    FatherRiver varchar
      

  6.   

    不想用微软的,我花了两个星期做了一个模仿动易2005的树,是菜了点,现在还有小小问题,不过大致可以显示这里有个初稿,没有整理,也不是完整代码,喜欢的复制到记事本看会比较清晰`可以用动易2005免费版本的数据库测试if(!this.IsPostBack)
    {

    //添加特定Item时这样绑定(这里添加多一个“无(做为一级栏目)”的选择,不在数据库读取的)
    //且根据接收的Depth判断他的深度
    //ddlParentID.Items.Add(new ListItem("无(做为一级栏目)","0"));
    while ( sdr.Read() ) 

    int tmpDepth=(int)sdr["Depth"];
    int[] arrShowLine;

    for(int i=0;i<20;i++)
    {
    arrShowLine=new int[i];
    //arrShowLine[i]=1;
    //ShowLine=true;
    }
    int tmpNextID=(int)sdr["NextID"];
    if (tmpNextID>0)
    {
    arrShowLine=new int[tmpDepth];
    //ShowLine=true;
    }
    else
    {
    //arrShowLine[tmpDepth]=-2;
    //ShowLine=false;
    }
    //子栏目输出方式
    if (tmpDepth>0)
    {
    string strTemp="";
    for(int i=1;i<tmpDepth+1;i++)
    {
    strTemp=strTemp+"&nbsp;&nbsp;";
    if(i==tmpDepth)
    {
    if((int)sdr["NextID"]>0)
    {
    strTemp=strTemp+"├&nbsp;";
    }
    else
    {
    strTemp=strTemp+"└&nbsp;";
    }
    }
    else
    {
    if (arrShowLine==new int[tmpDepth])
    {
    strTemp=strTemp+"│";
    }
    else
    {
    strTemp=strTemp+"&nbsp;";
    }
    }
    }
    strTemp=strTemp+sdr["ClassName"].ToString(); //判断是否外部连接
    if (sdr["LinkUrl"].ToString()!="")
    {
    strTemp=strTemp+"(外)";
    }
    //
    ddlParentID.Items.Add(new ListItem(HttpUtility.HtmlDecode(strTemp),sdr["ClassID"].ToString() ));
    }
    //跟栏目输出方式
    else
    {
    //判断是否外部连接
    if (sdr["LinkUrl"].ToString()!="")
    {
    ddlParentID.Items.Add(new ListItem(sdr["ClassName"].ToString()+"(外)",sdr["ClassID"].ToString() ));
    }
    else
    {
    ddlParentID.Items.Add(new ListItem(sdr["ClassName"].ToString(),sdr["ClassID"].ToString() ));
    }
    }
    }
    con.Close();
    }