需要添加fatherID字段,才能实现

解决方案 »

  1.   

    这样子设计数据库
    表 A有字段Id 和 DETAIL
    表 B有字段parentId childId sequence(在父ID下的次序)
    B表示的就是父ID和子ID的关系
    爷爷ID是0
    读取0以下的ID(就是从表B读取parentId为0的项 然后按sequence排序显示)
    依次递归下去 OK
      

  2.   

    ASP.NET 2.O的TREEVIEW,支持直接从XML读取,如果没有特别的需求,直接使用XML来生成,XML的可读性会非常好,维护自己也蛮方便的.
      

  3.   

    http://blog.csdn.net/spkl1/archive/2007/03/29/1545845.aspx
    我的BLOG
    TreeView递归算法
      

  4.   

    可以上我的bolg
    http://blog.csdn.net/fei0504
    上面写的有,记得给分啊
      

  5.   

    fei0504(菲菲) 
    你的只是一部分代码,因为我是初学者,能给我一个包含全部代码的实例吗?
    非常感谢
      

  6.   

    本人的代码如下:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Configuration;public partial class Default9 : System.Web.UI.Page
    {
           protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                AddTreeView(-1, (TreeNode)null);
            }    }
        protected void AddTreeView(Int64 ID, TreeNode tn)
        {
            //string objConn = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
            SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString().Trim());
            String strCmd = "select MaterialName,RowID from MaterialCodeDef where PRowID=" + ID;        SqlCommand objCmd = new SqlCommand();        objCmd.Connection = objConn;
            objConn.Open();
            objCmd.CommandText = strCmd;        SqlDataReader objDR = objCmd.ExecuteReader();        while (objDR.Read())
            {
                if (tn == null)
                {
                    TreeNode myNode = new TreeNode();
                    myNode.Text = objDR["MaterialName"].ToString().Trim();
                    myNode.Value = objDR["RowID"].ToString().Trim();
                    TreeView1.Nodes.Add(myNode);
                    AddTreeView(Int64.Parse(objDR["RowID"].ToString().Trim()), (TreeNode)myNode);
                }
                else
                {
                    TreeNode myNode1 = new TreeNode();
                    myNode1.Text = objDR["MaterialName"].ToString().Trim();
                    myNode1.Value = objDR["RowID"].ToString().Trim();
                    tn.ChildNodes.Add(myNode1);
                    AddTreeView(Int64.Parse(objDR["RowID"].ToString().Trim()), (TreeNode)myNode1);
                }
            }        objDR.Close();
            objConn.Close();
        }}web.config数据库连接如下:<configuration>
        <appSettings>
          <add key="ConnectionString" value="server=(local);database=sxl;User Id=sa; Password=;" />
           </appSettings>
      <system.web>-----------------------------------------------------------
    运行到:SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString().Trim());
    提示:未将对象引用设置到对象的实例。表MaterialCodeDef:
    1 PROWID char 3 1
    0 ROWID nvarchar 1050 1
    0 MaterialName varchar 50 1
      

  7.   

    不更改你的数据库结构同样可以办到        protected void Button1_Click(object sender, EventArgs e)
            {
                OleDbCommand command = new OleDbCommand("SELECT DETAIL, [NAME] FROM TABLE1 ORDER BY DETAIL,[NAME]", conn);
                OleDbDataReader dr = command.ExecuteReader();
                //TreeView1.BeginUpdate();
                TreeView1.Nodes.Clear();
                TreeNode parent = null;
                TreeNode child = null;
                string detail = "";
                TreeNode Grandparent = new TreeNode("公司");
                TreeView1.Nodes.Add(Grandparent);
                while (dr.Read())
                {                if (detail != dr.GetString(0))
                    {
                        parent = new TreeNode(dr.GetString(0));
                        Grandparent.ChildNodes.Add(parent);
                        detail = dr.GetString(0);
                    }
                    child = new TreeNode(dr.GetString(1));
                    parent.ChildNodes.Add(child);
                }
                //TreeView1.EndUpdate();
                dr.Close();
            }
      

  8.   

    fuyifan(冬冬,我永远爱你) ( ) 信誉:100    Blog   加为好友 完全正确
      

  9.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Data.OleDb;
    public partial class Default10 : System.Web.UI.Page
    {
        
        
        protected void Page_Load(object sender, EventArgs e)
        {    }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string CustomerDataConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
            SqlConnection conn = new SqlConnection(CustomerDataConnectionString);
                OleDbCommand command = new OleDbCommand("SELECT DETAIL, [NAME] FROM AAAA ORDER BY DETAIL,[NAME]", conn);
                OleDbDataReader dr = command.ExecuteReader();
                //TreeView1.BeginUpdate();
                TreeView1.Nodes.Clear();
                TreeNode parent = null;
                TreeNode child = null;
                string detail = "";
                TreeNode Grandparent = new TreeNode("公司");
                TreeView1.Nodes.Add(Grandparent);
                while (dr.Read())
                {                if (detail != dr.GetString(0))
                    {
                        parent = new TreeNode(dr.GetString(0));
                        Grandparent.ChildNodes.Add(parent);
                        detail = dr.GetString(0);
                    }
                    child = new TreeNode(dr.GetString(1));
                    parent.ChildNodes.Add(child);
                }
                //TreeView1.EndUpdate();
                dr.Close();
                }
    }
    提示:
    错误 4 与“System.Data.OleDb.OleDbCommand.OleDbCommand(string, System.Data.OleDb.OleDbConnection)”最匹配的重载方法具有一些无效参数 D:\公司网站\Default10.aspx.cs 29 36 D:\公司网站\
    错误 5 参数“2”: 无法从“System.Data.SqlClient.SqlConnection”转换为“System.Data.OleDb.OleDbConnection” D:\公司网站\Default10.aspx.cs 29 111 D:\公司网站\
      

  10.   

    如果不会做还是用简单的方法吧,给你个思路:从表中读两次,一次读出所有部门,第二次读整张表,保存为两个DataSet;
    循环第一张表,添加节点,每添加一个节点,检查第二张表有没有和它相符的记录(人员),有就循环添加人员(用查找表 Select() 得出 DataRow 数组,然后 Foreach 这个数组);
    OK!
      

  11.   

    给你一个简单的方法类吧,直接调用传入根节点我相关数据表即可////////////////////////////////////////////////////////////
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Windows.Forms;namespace blueMIS.Class
    {
        /// <summary>
        /// 提供一个公共的 TreeNode 生成方法,使用三个 DataSet 创建一个 TreeNode,支持三层逻辑属性(不是指只有三层结点)
        /// DataSet 的结构必须为 node_text, node_name, node_parents, [node_tag]....
        /// </summary>
        public class clsTreeNodeCreator
        {
            /// <summary>
            /// dsBaseStructure:用于创建 Tree 的主结构,主结构可以为多级:如公司所有部门及下级单位、材料的多级分类
            /// ds1, ds2:用于创建与主结构挂接的下级属性,其中 ds2 为 ds1 的下一级属性:如公司所有部门单位所属的人员,以及每个人员所负责的工作项目
            /// </summary>
            private DataSet dsBaseStructure, dsF1, dsF2;
            private TreeNode rootNode;        public clsTreeNodeCreator(TreeNode node, DataSet ds, DataSet ds1, DataSet ds2)
            {
                rootNode = node;
                dsBaseStructure = ds;
                dsF1 = ds1;
                dsF2 = ds2;
            }
            public clsTreeNodeCreator(TreeNode node, DataSet ds, DataSet ds1)
            {
                rootNode = node;
                dsBaseStructure = ds;
                dsF1 = ds1;
                dsF2 = null;
            }
            public clsTreeNodeCreator(TreeNode node, DataSet ds)
            {
                rootNode = node;
                dsBaseStructure = ds;
                dsF1 = null;
                dsF2 = null;
            }        public TreeNode getTreeNode(string rootNodeSelectExpress)
            {
                if (dsBaseStructure != null)
                {
                    DataRow[] dRows = dsBaseStructure.Tables[0].Select(rootNodeSelectExpress);
                    if (dRows.Length > 0)
                        getModProChild(dRows, rootNode, 1, true, false);
                }
                return rootNode;
            }        /// <summary>
            /// 获取模块下子节点
            /// </summary>
            /// <param name="dRows">用来添加本层结构的 DataRow</param>
            /// <param name="node">被添加的节点</param>
            /// <param name="imgIndex">本层结点的 ImageIndex</param>
            /// <param name="baseF">当前节点是否属于主结构,只允许基本结构嵌套,第二层属性不允许挂在主结构下</param>
            /// <param name="F1">当前节点是否属于第一层属性,第二层属性只能挂在第一层属性下</param>
            private void getModProChild(DataRow[] dRows, TreeNode node, int imgIndex, bool baseF, bool F1)
            {
                TreeNode childNode;
                DataRow[] dRows0, dRows1, dRows2;
                foreach (DataRow dr in dRows)
                {
                    childNode = new TreeNode();
                    childNode.Text = dr.ItemArray[0].ToString();
                    childNode.Name = dr.ItemArray[1].ToString();
                    if (dr.ItemArray.Length > 3)
                        childNode.Tag = dr.ItemArray[3].ToString();
                    childNode.ImageIndex = imgIndex;
                    childNode.SelectedImageIndex = imgIndex;                // 主结构的递归
                    if (baseF)
                    {
                        dRows0 = dsBaseStructure.Tables[0].Select("node_parents = '" + childNode.Name + "'");
                        if (dRows0.Length > 0)
                            getModProChild(dRows0, childNode, 1, true, false);
                    }                // 向主结构添加第一层属性
                    if (dsF1 != null && baseF)
                    {
                        dRows1 = dsF1.Tables[0].Select("node_parents = '" + childNode.Name + "'");
                        if (dRows1.Length > 0)
                            getModProChild(dRows1, childNode, 2, false, true);
                    }                // 向第一层属性添加第二层属性
                    if (dsF2 != null && F1)
                    {
                        dRows2 = dsF2.Tables[0].Select("node_parents = '" + childNode.Name + "'");
                        if (dRows2.Length > 0)
                            getModProChild(dRows2, childNode, 3, false, false);
                    }                node.Nodes.Add(childNode);
                }
            }
           
        }
    }
      

  12.   

    动行提示:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。以下是我最新的代码:using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Configuration;public partial class Default9 : System.Web.UI.Page
    {
           protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                AddTreeView(1, (TreeNode)null);
            }    }
        protected void AddTreeView(Int64 ID, TreeNode tn)
        {
                  
           string CustomerDataConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
            SqlConnection objConn = new SqlConnection(CustomerDataConnectionString);     String strCmd = "select DETAIL,NAME from AAAA where ID=" + ID;        SqlCommand objCmd = new SqlCommand();        objCmd.Connection = objConn;
            objConn.Open();
            objCmd.CommandText = strCmd;        SqlDataReader objDR = objCmd.ExecuteReader();        while (objDR.Read())
            {
                if (tn == null)
                {
                    TreeNode myNode = new TreeNode();
                    myNode.Text = objDR["DETAIL"].ToString().Trim();
                    myNode.Value = objDR["NAME"].ToString().Trim();
                    TreeView1.Nodes.Add(myNode);
                    AddTreeView(Int64.Parse(objDR["DETAIL"].ToString().Trim()), (TreeNode)myNode);
                }
                else
                {
                    TreeNode myNode1 = new TreeNode();
                    myNode1.Text = objDR["DETAIL"].ToString().Trim();
                    myNode1.Value = objDR["NAME"].ToString().Trim();
                    tn.ChildNodes.Add(myNode1);
                    AddTreeView(Int64.Parse(objDR["DETAIL"].ToString().Trim()), (TreeNode)myNode1);
                }
            }        objDR.Close();
            objConn.Close();
        }
      }