我想设计个treeview,
除了标题,要有三到四层,不知道数据库该怎么设计,每个节点又怎么读取数据?在线等 有例子的最好可以qq :214947658

解决方案 »

  1.   

    treeview倒是很简单,单你的要求说的不够详细,不懂!请详细说明
      

  2.   

    设置parent和深度,再递归绑定到treeview
    参考
      

  3.   

    数据库用一个表可以设计两个字段(就是两列)
    一列是treeview各节点的名称(文本值)
     一列是有规律的数字
      如第一个根节点是001
       第一个根节点的第一个子节点为001001
      具体怎么简化可以自己想参照这个简化
     
      

  4.   

    先学习treeView然后数据库,接分
      

  5.   

     1using System;
      2using System.Collections;
      3using System.ComponentModel;
      4using System.Data;
      5using System.Drawing;
      6using System.Web;
      7using System.Web.SessionState;
      8using System.Web.UI;
      9using System.Web.UI.WebControls;
     10using System.Web.UI.HtmlControls;
     11using System.Data.OracleClient;
     12using Microsoft.Web.UI.WebControls;
     13using System.Data.SqlClient;
     14namespace test
     15{
     16 /**//// <summary>
     17 /// WebForm5 的摘要说明。
     18 /// </summary>
     19 public class WebForm5 : System.Web.UI.Page
     20 {
     21  protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
     22 
     23  private DataTable objDataTable;
     24
     25  private void Page_Load(object sender, System.EventArgs e)
     26  {
     27   // 在此处放置用户代码以初始化页面
     28
     29   
     30   objDataTable = GetBackupRecord();  //取得所有数据得到DataTable 
     31   this.CreateTree( TreeView1.Nodes,"0" ); //建立节点
     32  }
     33
     34  Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
     35  override protected void OnInit(EventArgs e)
     36  {
     37   //
     38   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
     39   //
     40   InitializeComponent();
     41   base.OnInit(e);
     42  }
     43  
     44  /**//// <summary>
     45  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
     46  /// 此方法的内容。
     47  /// </summary>
     48  private void InitializeComponent()
     49  {    
     50   this.Load += new System.EventHandler(this.Page_Load);
     51
     52  }
     53  #endregion
     54
     55绑定树控件#region 绑定树控件
     56  private void CreateTree( TreeNodeCollection node,string parent_id ) 
     57  { 
     58   DataView dvList = new DataView( this.objDataTable ); 
     59   dvList.RowFilter = "parentiidd=" + parent_id + "";  //过滤父节点 
     60   TreeNode nodeTemp; 
     61   foreach ( DataRowView dv in dvList ) 
     62   { 
     63    nodeTemp = new TreeNode(); 
     64    nodeTemp.ID = dv["iidd"].ToString();  //节点ID 
     65    nodeTemp.Text = dv["type"].ToString();  //节点名称 
     66    //nodeTemp.NavigateUrl = dv["ADDRESS"].ToString();  //节点链接地址 
     67    //nodeTemp.ImageUrl = dv["IMAGE"].ToString();  //节点图片(未展开) 
     68    //nodeTemp.SelectedImageUrl = dv["IMAGE_EX"].ToString();  //节点图片(展开) 
     69    nodeTemp.Target = "_parent";  //节点链接Target 
     70     
     71    node.Add( nodeTemp );  //加入节点 
     72    this.CreateTree( nodeTemp.Nodes,nodeTemp.ID );  //递归 
     73
     74   
     75    
     76   } 
     77  }
     78#endregion
     79
     80
     81得到数据#region 得到数据 
     82  public DataTable GetBackupRecord()
     83  {
     84   try
     85   {
     86
     87    string str="server=localhost;database=lsa1008pt;uid=sa;pwd=sundun";
     88    SqlConnection conn=new SqlConnection(str);
     89    SqlDataAdapter da=new SqlDataAdapter("select * from gg_bilu_wenhuatype",conn);
     90
     91    DataSet dataSet =new DataSet();
     92    da.Fill(dataSet);
     93
     94    return dataSet.Tables[0];
     95   }
     96   catch(Exception e)
     97   {
     98    throw e;
     99   }
    100  }
    101#endregion
    102 }
    103}
      

  6.   

    表结构一般就是
    id  description parentid
      

  7.   

    设计一个表格,只需要两个字段就可以了,如下:
    parentID childID
    1 58
    1 64
    1 65
    1               2
    2 3
    2 4
    3 24
    3 15
    65 54
    这个父子关系表记录你的树形目录中所有的父子关系
    即使某个对象,比方讲对象1,有子对象2,孙对象3,重孙对象24和15
    在这个表中把他们拆分成成对的父子关系
    你要记住的顶级对象是谁,如果顶级对象是1,简要流程如下:
    ------------------------------------------------------------------------
    顶级树节点设为对象1添加子节点函数(参数为你的当前对象『首次调用时为对象1』,和对应的树节点)
    {
     向父子关系表检索以当前对象为父亲的所有父子关系。
      遍历每一对父子关系
      {
         对应子对象建立一个树节点,挂到当前为父节点的树节点
             向父子关系表查询当前子对象是否还有有子对象,如果有,则自身调用添加子节点函数
       }
    }------------------------------------------------------------------------这样就行了
      

  8.   

    数据库定义ID,PID。建立外键关联。使用递归SQL选择数据, 在程序中使用递归构造这个树。
      

  9.   

    数据库里主要字段如下
    id 节点id
    name 节点名
    parentid 父节点id(根节点父节点为0)
    代码如下public partial class AdminManage_TieZiManage_TieLeft : System.Web.UI.Page
    {
        DataTable dt = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            dt = bankuaidal.GetDataTable();
            InitTree();     
        }
     private void InitTree() //取根节点
        {
            DataRow[] drs = dt.Select("q_ParentID=0", "q_ID asc");        for (int i = 0; i < drs.Length; i++)
            {
                TreeNode tn = new TreeNode(drs[i][1].ToString());
                tn.SelectAction = TreeNodeSelectAction.Expand;
                this.TreeView1.Nodes.Add(tn);            LoadTree(tn, Convert.ToInt32(drs[i][0]));//递归
            }
        }
        private void LoadTree(TreeNode tn, int parentid)//一直递归下去,直到没有子节点
        {
            DataRow[] drs = dt.Select("q_ParentID=" + parentid, "q_ID asc");
            for (int i = 0; i < drs.Length; i++)
            {
                TreeNode child = new TreeNode(drs[i][1].ToString());            child.NavigateUrl = "~/AdminManage/TieZiManage/BanKuaiTie.aspx?id=" + Convert.ToInt32(drs[i][0]);
                child.Target = "tright";
                child.SelectAction = TreeNodeSelectAction.Expand;            tn.ChildNodes.Add(child);            LoadTree(child, Convert.ToInt32(drs[i][0]));
            }
        }
    }
      

  10.   


    数据库:公司:id(int)     company(varchar(50)部门:id(int)     deid(int)     department(varchar(50))班组:id(int)     coid(int)     class(varchar(50))DB DBManager = new DB();//实例化数据库操作类
            string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["rizhi"].ConnectionString;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    //TreeView1.Attributes.Add("onclick", "OnTreeNodeChecked()");
                    TreeView1.Attributes.Add("onclick", "testClick(event);return true;");//单击文字,CheckBox=true                TreeView1.ShowCheckBoxes = TreeNodeTypes.Leaf;//最后一级选中
                    TreeView1.ExpandDepth = 0;//不展开                using (SqlConnection conn = new SqlConnection(strConn))
                    {
                        DataSet ds_company = new DataSet();//实例化数据集(公司)
                        SqlDataAdapter sda_company = new SqlDataAdapter("select * from [company] where id<>"+0+" and id<>"+1001, conn);//实例化数据适配器(公司)
                        sda_company.Fill(ds_company, "company");//虚拟表填充到内存
                        for (int i = 0; i < ds_company.Tables["company"].Rows.Count; i++)//循环所有"公司"
                        {
                            TreeNode td_company = new TreeNode();//实例化公司节点
                            td_company.Text = ds_company.Tables["company"].Rows[i]["company"].ToString();//公司节点名称
                            TreeView1.Nodes.Add(td_company);//将公司节点添加至"树"
                            td_company.SelectAction = TreeNodeSelectAction.Expand;                        DataSet ds_department = new DataSet();//实例化数据集(部门)
                            SqlDataAdapter sda_department = new SqlDataAdapter("select * from [department] where [coid]=" + ds_company.Tables["company"].Rows[i]["id"]+" and department<>'全公司'" , conn);//实例化数据库适配器(部门)
                            sda_department.Fill(ds_department, "department");//虚拟表填充到内存
                            for (int j = 0; j < ds_department.Tables["department"].Rows.Count; j++)//循环 ds.Tables["department"].Rows[i]["id"] 对应的所有部门
                            {
                                TreeNode td_department = new TreeNode();//实例化部门节点
                                td_department.Text = ds_department.Tables["department"].Rows[j]["department"].ToString();//部门节点名称
                                td_company.ChildNodes.Add(td_department);//填充部门节点至"树"
                                td_department.SelectAction = TreeNodeSelectAction.Expand;//只允许展开                            #region 如果人员属于某个班组
                                if (DBManager.getDs("select [info] from [user] where [pid]=" + ds_department.Tables["department"].Rows[j]["id"] + "", "is").Tables["is"].Rows.Count == 0)
                                {                                DataSet ds_class = new DataSet();//实例化数据集(班组)
                                    SqlDataAdapter sda_class = new SqlDataAdapter("select * from [class] where [deid]=" + ds_department.Tables["department"].Rows[j]["id"], conn);//实例化数据库适配器(班组)
                                    sda_class.Fill(ds_class, "class");//虚拟表填充到内存
                                    for (int z = 0; z < ds_class.Tables["class"].Rows.Count; z++)//循环 ds_department.Tables["class"].Rows[j]["id"] 对应的所有班组
                                    {
                                        TreeNode td_class = new TreeNode();//实例化班组节点
                                        td_class.Text = ds_class.Tables["class"].Rows[z]["class"].ToString();//班组节点名称
                                        td_department.ChildNodes.Add(td_class);//填充班组节点至"树"
                                        td_class.SelectAction = TreeNodeSelectAction.Expand;//只允许展开                                    DataSet ds_user = new DataSet();//实例化数据集(人员)
                                        SqlDataAdapter sda_user = new SqlDataAdapter("select [name] from [user] where [pid]=" + ds_class.Tables["class"].Rows[z]["id"] + "", conn);////实例化数据库适配器(人员)
                                        sda_user.Fill(ds_user, "user");//虚拟表填充到内存
                                        for (int k = 0; k < ds_user.Tables["user"].Rows.Count; k++)//循环 ds_department.Tables["user"].Rows[k]["name"] 对应的所有人员
                                        {
                                            TreeNode td_user = new TreeNode();//实例化班组节点
                                            td_user.Text = ds_user.Tables["user"].Rows[k]["name"].ToString();//人员节点名称
                                            td_class.ChildNodes.Add(td_user);//填充人员节点至"树"
                                            td_user.NavigateUrl = "javascript:void(0)";//选中,但无效
                                        }
                                    }
                                }
                                #endregion                            #region 如果人员直接属于某个部门
                                else
                                {
                                    DataSet ds_user = new DataSet();
                                    SqlDataAdapter sda_user = new SqlDataAdapter("select [name] from [user] where [pid]=" + ds_department.Tables["department"].Rows[j]["id"] + "", conn);
                                    sda_user.Fill(ds_user, "user");
                                    for (int k = 0; k < ds_user.Tables["user"].Rows.Count; k++)
                                    {
                                        TreeNode td_user = new TreeNode();
                                        td_user.Text = ds_user.Tables["user"].Rows[k]["name"].ToString();
                                        td_department.ChildNodes.Add(td_user);
                                        td_user.NavigateUrl = "javascript:void(0)";
                                    }
                                }
                                #endregion
                            }
                        }
                    }
                }
            }
      

  11.   


     string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["rizhi"].ConnectionString;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    DataSet ds = new DataSet();
                    SqlConnection conn = new SqlConnection(strConn);
                    using (conn)
                    {
                        SqlDataAdapter sda_Company = new SqlDataAdapter("select [id],[company] from [company]", conn);
                        sda_Company.Fill(ds, "company");
                        TreeNode tn_Company;
                        TreeNode tn_Department;
                        TreeNode tn_Class;
                        foreach (DataRow company_row in ds.Tables["company"].Rows)
                        {
                            tn_Company = new TreeNode();
                            tn_Company.Text = company_row["company"].ToString();
                            tn_Company.Value = company_row["id"].ToString();
                            TreeView1.Nodes.Add(tn_Company);                        SqlDataAdapter sda_Department = new SqlDataAdapter("select [id],[department] from [department] where coid=" + tn_Company.Value, conn);
                            sda_Department.Fill(ds, "department");
                            if (ds.Tables["department"].Rows.Count > 0)
                            {
                                foreach (DataRow department_row in ds.Tables["department"].Rows)
                                {
                                    tn_Department = new TreeNode();
                                    tn_Department.Text = department_row["department"].ToString();
                                    tn_Department.Value = department_row["id"].ToString();
                                    tn_Company.ChildNodes.Add(tn_Department);                                SqlDataAdapter sda_Class = new SqlDataAdapter("select [id],[class] from [class] where deid=" + tn_Department.Value, conn);
                                    sda_Class.Fill(ds, "class");
                                    if (ds.Tables["class"].Rows.Count > 0)
                                    {
                                        foreach (DataRow class_row in ds.Tables["class"].Rows)
                                        {
                                            tn_Class = new TreeNode();
                                            tn_Class.Text = class_row["class"].ToString();
                                            tn_Class.Value = class_row["id"].ToString();
                                            tn_Department.ChildNodes.Add(tn_Class);
                                        }
                                        ds.Tables["class"].Clear();
                                    }
                                    sda_Class.Dispose();
                                }
                                ds.Tables["department"].Clear();
                            }
                            sda_Department.Dispose();
                        }
                        sda_Company.Dispose();                }
                }
    }
      

  12.   

      public void bindTv()
            {
                ds = new DataSet();
                using (SqlConnection conn = new SqlConnection(strConn))
                {
                    conn.Open();
                    SqlDataAdapter sda = new SqlDataAdapter("select * from [class]", conn);
                    sda.Fill(ds);
                }
                AddTree(101, (TreeNode)null);
            }        public void AddTree(int ParentID,TreeNode pNode)
            {            DataView dvTree = new DataView(ds.Tables[0]);
                string Fstr = "[deid]=" + ParentID;
                dvTree.RowFilter = Fstr;
                foreach (DataRowView Row in dvTree)
                {
                    TreeNode Node = new TreeNode();
                    if (pNode == null)
                    {
                        Node.Value = Row["id"].ToString();
                        Node.Text = Row["class"].ToString();
                        TreeView1.Nodes.Add(Node);
                        AddTree(Int32.Parse(Row["id"].ToString()), Node);
                    }
                    else
                    {
                        Node.Value = Row["id"].ToString();
                        Node.Text = Row["class"].ToString();
                        pNode.ChildNodes.Add(Node);
                        AddTree(Int32.Parse(Row["id"].ToString()), Node);
                    }
                }
            }
      

  13.   

    id name parentId
    1  A    0
    2  B    0
    3  C    0
    3  A-1  1
    4  A-2  1
    5  A-3  1
    6  B-1  2
    7  B-2  2
    8  B-3  2
    9  C-1  3
    10 C-2  3
    11 C-3  3
    12 C-21 11自己看吧
      

  14.   

    数据库 可以
    id pid          cid             name
    id 父节点id      子节点id        叶子名然后检索出来数据
    绑定到treeview就好了
      

  15.   

    数据库用一个表可以设计两个字段(就是两列) 
    一列是treeview各节点的名称(文本值) 
    一列是有规律的数字 
      如第一个根节点是001 
      第一个根节点的第一个子节点为001001 
      具体怎么简化可以自己想参照这个简化 
      

  16.   

    设置一个ID,然后设置一个PID即可
      

  17.   

    数据库建一个表
    TreeView
    字段 ID(int),ParentID(int),TreeNodeName(string)
    也就是让这个表的记录存在父子关系
      

  18.   

    下面代码测试通过.树结构可以放在一个表中实现,记录ID及父项ID就可以.测试数据
    -- fuqin 父ID
    -- daishu 代数
    create table table1 (id int,name nvarchar(20),fuqin int,daishu int) insert into table1 
    select 1 as id, '第0代' as name,0 as fuqin,0 as daishu 
    union all 
    select 2 as id, '第1代01' as name,1 as fuqin,1 as daishu 
    union all 
    select 3 as id, '第1代02' as name,1 as fuqin,1 as daishu 
    union all 
    select 4 as id, '第2代01' as name,2 as fuqin,2 as daishu 
    union all 
    select 5 as id, '第2代02' as name,2 as fuqin,2 as daishu 
    union all 
    select 6 as id, '第2代01' as name,3 as fuqin,2 as daishu 
    union all 
    select 7 as id, '第2代02' as name,3 as fuqin,2 as daishu 
    union all 
    select 8 as id, '第3代01' as name,7 as fuqin,3 as daishu 
    union all 
    select 9 as id, '第3代02' as name,7 as fuqin,3 as daishu 页面设计<body>
        <form id="form1" runat="server">
        <div>
          <table >
          <tr>
          <td colspan=></td>
          </tr>
          </table>
            <asp:TreeView ID="TreeView1" runat="server">
            </asp:TreeView>
            <br />
            <asp:Button ID="btnBuild" runat="server" onclick="btnBuild_Click" 
                Text="Build Tree" />
        </div>
        </form>
    </body>
    后台代码private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=;"; 
        protected void btnBuild_Click(object sender, EventArgs e) 
        { 
            
            SqlConnection con = new SqlConnection(); 
            con.ConnectionString = conString; 
            con.Open(); 
            string sqlSelect = "Select * From table1"; 
            SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con); 
            DataTable dt = new DataTable(); 
            adapter.Fill(dt);         // 代数为0的纪录 
            DataRow[] drs = dt.Select("daishu=0");         TreeView1.Nodes.Clear(); 
            foreach(DataRow dr in drs) 
            { 
                TreeNode node = new TreeNode(dr["name"].ToString()); 
                node.Value = dr["name"].ToString(); 
                // 创建下级节点 
                CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node); 
                TreeView1.Nodes.Add(node); 
            }         adapter.Dispose(); 
            con.Close(); 
        }     /// <summary> 
        /// 创建子节点 
        /// </summary> 
        /// <param name="dt">世系表 </param> 
        /// <param name="fuqin">父亲 </param> 
        /// <param name="parentNode">父节点 </param> 
        private void CreateSubNode(DataTable dt,int fuqin,TreeNode parentNode) 
        { 
            DataRow[] drs = dt.Select(string.Format("fuqin={0}",fuqin)); 
            foreach(DataRow dr in drs) 
            { 
                TreeNode node = new TreeNode(dr["name"].ToString()); 
                node.Value = dr["name"].ToString(); 
                // 创建下级节点 
                CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node); 
                parentNode.ChildNodes.Add(node); 
            } 
        }
      

  19.   

    http://topic.csdn.net/u/20090511/23/9515b5b1-a1f9-41d9-b7a4-369aa95ce08c.html
      

  20.   

    http://topic.csdn.net/u/20090511/23/9515b5b1-a1f9-41d9-b7a4-369aa95ce08c.html
      

  21.   

    如果你数据量小的话可以设计成一张表一个孩子接点一个字段,查出来用分组处理,再循环复制到树控件中去,如果数据量大的话建议设计一个孩子节点一张表通过主外键一级一级关联。补充:如果你的孩子节点是动态可配置的话,建议设计成一张表好处理些,也可以另类设计,如建表 TABLE1 字段 IDS,菜单名,上级菜单ID,菜单级数(INT 1...n)查出视图可以根据“菜单级数”字段动态生成:SELECT DECODE(菜单级数,1,菜单名,NULL) AS 一级菜单,DECODE(菜单级数,2,菜单名,NULL) AS 二级菜单,上级菜单ID,IDS FROM TABLE1 ORDER BY 菜单级数,怎么画就不用写了吧,GOOGLE上一搜代码一大堆,看你怎么发挥写了。建议全写成动态的以后维护方便。
      

  22.   

    这个问题以前碰到过,我记在我的博客上了,题目是“根据数据库创建TreeView的方法 ”,应该能解决你的问题。有固定的函数,已经封装!可以直接调用!
    地址 http://www.cnblogs.com/CShapWinForms/archive/2006/04/15/376028.html
      

  23.   

    是要把数据显示在TreeView吗?
    数据表:
      ID,名称,上级ID
            public void treeView(TreeView tree, TableName tableName,string sqlstr)
            {
                string[] list = tableName == TableName.dept ? dept : tableName == TableName.store ? store : tableName == TableName.type ? type : null;
                tree.Nodes.Clear();
                DataTable dt = ConvertDataReaderToDataTable(DRSetSql(sqlstr));
                DataRow[] drow = dt.Select(list[0].ToString() + 0);            if (drow.Length <= 0) return;            for (int i = 0; i < drow.Length; i++)
                {
                    TreeNode tr = new TreeNode(drow[i][list[1].ToString()].ToString(), drow[i][list[2].ToString()].ToString());               
                    tr.NavigateUrl = "#" + drow[i][list[1].ToString()].ToString() + "&" + drow[i][list[2].ToString()].ToString();
                    treeNote(tr, drow[i][list[2].ToString()].ToString(), dt, list);
                    tree.Nodes.Add(tr);
                }
            }
     public void treeNote(TreeNode tn, string upperID, DataTable de, string[] list)
            {
                DataRow[] drow = de.Select(list[0].ToString() + upperID);            if (drow.Length <= 0) return;            for (int i = 0; i < drow.Length; i++)
                {
                    TreeNode node = new TreeNode(drow[i][list[1].ToString()].ToString(), drow[i][list[2].ToString()].ToString());            
                    node.NavigateUrl = "#" + drow[i][list[1].ToString()].ToString() + "&" + drow[i][list[2].ToString()].ToString();
                    treeNote(node, drow[i][list[2].ToString()].ToString(), de, list);
                    tn.ChildNodes.Add(node);
                }
            }
    读取
      

  24.   

    数据  id   name    fid(父节点id)
      11    aaa     0(根节点)
      12    bbb     0
      1101   ffff   11
      1202    uuuu  12 
      

  25.   

    http://blog.csdn.net/lbh9158/archive/2006/12/13/1440575.aspx
    http://blog.csdn.net/gislinggis/archive/2006/12/29/1466893.aspx
    参考吧
      

  26.   

    真是人多力量大呀,好多人的回答都很好,我看了总结下吧,对以后的人有点帮助一、递归法:
        先设父节点,有开始,下面就是递归了,层数自己想多就是多少了二、用xml文档
        这个只要把XML文档设计好,直接读就行了
    要有别的方法,请补充!再过会就结贴我再加100分,来的都有分,有帮助的更多 
      

  27.   

    数据库设计的话只要用内联就可以了例如:
     ID      Name   ParentID
      1       t1       0
      2       t2       0
      3       t3       2
      4       t4       1
      5       t5       4
      6       t6       5这样表示,不管你多少层都可以 0表示根节点~ 
      

  28.   

    数据库可以在一个表里 用 id parentid 区分 或者 每个层建一个表
      

  29.   

    n层都一样啊
    ID - ParentID -Text
    就完了啊,仔细想想
    根ID=-1或0