现在数据库里有这么几个字段ID,HHHno(varchar(50)),HHHType(int).
其中HHHno是这样的1, 1.1, 1.1.1, 2.5.6,就是这种类型的。它表明了所有数据的父子关系。如果看不懂这句话或这个字段的含义,请不要回复此贴。
HHHType表示级别,和HHHno字段对应,
HHHno   HHHType
1         1
1.1       2
1.1.1     3
2         1
2.1       2
2.1.1     3
2.1.2     3现在要把这些数据绑定到TreeView中去。求好的方法。我前面发给帖子,能够实现功能,但总感觉不好。

解决方案 »

  1.   

    数据库结构建立得不好。放个字段PID,记录上级目录的ID就可以了。最好有个字段RID ,记录一级目录的排序,这样最方便HHHno 根本就是多余。select * from T order by RID ,PID然后绑定就可以了
      

  2.   

    在不改变表结构的情况下以可以实现,先按字段HHHno的顺序取出表,然后用递归生成Tree,递归时会用到字段HHHType。
      

  3.   

    我建立该做法,
    Table 列 为 ID(唯一),ParentId(记录父节点)下面是一个从文本文件中读取记录的方法,贴给你看一看,希望对你有所帮助
    private void btnOK_Click(object sender, System.EventArgs e)
    {
    this.LoadStdSubj("");
    } private void LoadStdSubj(string strValue)
    {
    string path = "StdSub.txt";
    string str  = "";
    int length = 0 ; this.trvStdTree.Nodes[0].Nodes.Clear();

    StreamReader sr = new StreamReader(path);
    while ( sr.Peek() >-1 )
    {
    str = sr.ReadLine();
    length  = str.IndexOf(":",0);
    string str1 = str.Substring(0,length);
    string str2 = str.Substring(length+1);
    //this.trvStdTree.SelectedNode = this.trvStdTree.Nodes[0];
    this.FormStdTree(str1,str2);
    }
    sr.Close();
    } private void FormStdTree(string strSubject,string strParent)
    {
    if( strParent == "NULL")
    {
    //首先选中
    this.trvStdTree.SelectedNode = this.trvStdTree.Nodes[0];
    TreeNode node = new TreeNode(strSubject);
    this.trvStdTree.Nodes[0].Nodes.Add(node);
    //this.trvStdTree.SelectedNode = node;
    }
    else
    {
    foreach(TreeNode node2 in this.trvStdTree.Nodes)
    {
    SelectNode(node2,strParent);
    }
    TreeNode node3 = new TreeNode(strSubject);
    this.trvStdTree.SelectedNode.Nodes.Add(node3); }
    } private void SelectNode(TreeNode treeNode,string SubjID)
    {
    if(treeNode.Text == SubjID)
    {
    treeNode.TreeView.SelectedNode = treeNode;
    }
    else
    {
    foreach(TreeNode node in treeNode.Nodes)
    {
    this.SelectNode(node,SubjID);
    }
    }
    }
      

  4.   

    我觉得最好还是建立一个合理的无限级表id classname  parentid  orderby 
    像这种表用递归就可以实现
      

  5.   

    完美解决方法,无需递归,一次填充,注意:句点“.”之间的编码长度要一致!
    public partial class Default2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {        LoadTreeNode();
        }
        private void LoadTreeNode()
        {
            string ls_conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";
            string ls_sel = "select HHHno,HHHType from Table1 order by HHHno";
            TreeNode[] tNode;
            string Hno = "";
            int HType = 0;
            tNode = new TreeNode[3];        using (SqlConnection conn = new SqlConnection(ls_conStr))
            {
                SqlCommand cmd = new SqlCommand(ls_sel, conn);
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                while (dr.Read())
                {
                    Hno = dr[0].ToString();
                    HType = Convert.ToInt16(dr[1].ToString());
                    TreeNode curNode = new TreeNode(Hno, HType.ToString());
                    if (HType == 1)
                    {
                        //插入第一级节点
                        TreeView1.Nodes.Add(curNode);
                    }
                    else 
                    {
                        tNode[HType - 1 - 1].ChildNodes.Add(curNode);
                    }
                    tNode[HType-1] = curNode;
                }
                dr.Close();
                dr.Dispose();
            }
        }
    }======================================================= 
    The CodeGear.cn 你身边的开发资源 
      

  6.   

    drop table tb
    go
    create table tb (hno varchar(50),htype int)
    insert into tb select '1',1
    insert into tb select '1.1',2
    insert into tb select '1.1.1',3
    insert into tb select '2',1
    insert into tb select '2.1',2
    insert into tb select '2.1.1',3
    insert into tb select '2.1.2',3
    go
    --删除1.1下
    --delete tb where hno like'1.1%'
    --插入2.1下
    declare @no varchar(10),@hno varchar(20)
    set @no = '2.1'
    select top 1 @hno=hno from tb where hno like @no+'%' and htype=(select htype+1 from tb where hno=@no) order by hno desc
    set @hno = @no+'.'+ ltrim(cast(right(@hno,charindex('.',reverse(@hno))-1) as int)+1)
    insert into tb(hno,htype) select @hno,htype=(select htype+1 from tb where hno=@no)
    select * from tb order by hno,htype
    hno htype
    1 1
    1.1 2
    1.1.1 3
    2 1
    2.1 2
    2.1.1 3
    2.1.2 3
    2.1.3 3
      

  7.   

    我觉得,可以用递归建树
    这里我不写具体的,只提供参考:
    这里要先写个函数FindChild,功能是返回他的所有孩子数组;
    build(root){
        if(root.finchild.length!=0){
            
            for(...){
                setup(root.finchild[i]);
                sethischild(root,root.finchild[i]);
            }
        }
    }setup(node){
        if(node.finchild.length!=0){
            
            for(...){
                setup(node.finchild[i]);
                sethischild(node,node.finchild[i]);
            }
        }
    }
      

  8.   

    弄的那么麻烦 简单一点 一个PID 一个排序 一个名称  一个主键id就可以了
      

  9.   

    数据库建的的确不怎么滴!用Pid和Cid就可以做完你的工作!
      

  10.   

     /// <summary>
            /// 将数据表中typeName字段替换成树形
            /// </summary>
            /// <param name="table">表名</param>
            /// <returns>填充后的数据表</returns>
            public DataTable getTreeDataTable(string  table)
            {
                DataTable dtSource = new DataTable();
                TreeAction a = new TreeAction();
                dtSource = a.list(table);//得到列表
                //a.close();
                char nbsp = (char)0xA0;  //空格
                string strTmp = "";
                string itemText, itemValue;            for (int i = 0; i<= dtSource.Rows.Count - 1; i++)
                {
                    DataRow dr=dtSource.Rows[i];
                    int tmpDepth = (int)dr["Depth"];
                    int NextID = (int)dr["NextID"];
                    int typeID = (int)dr["typeID"];
                    int child = (int)dr["child"];
                    string typeName = (string)dr["typeName"];                try
                    {
                        ShowLine[tmpDepth] = NextID > 0 ? true : false;//这个值是经常被修改的.
                    }
                    catch
                    {
                        ShowLine.Add(false);
                        ShowLine[tmpDepth] = NextID > 0 ? true : false;//这个值是经常被修改的.
                    }                itemValue = typeID.ToString();  //值
                    itemText = ""; //显示内容                if (tmpDepth > 0)
                    {
                        for (int j = 1; j <= tmpDepth; j++)
                        {
                            itemText += strTmp.PadLeft(2, nbsp);
                            if (j == tmpDepth)
                            {
                                if (NextID > 0)
                                    itemText += "├" + strTmp.PadLeft(1, nbsp);
                                else
                                    itemText += "└" + strTmp.PadLeft(1, nbsp);
                            }
                            else
                            {
                                if ((bool)ShowLine[j])
                                    itemText += "│";
                                else
                                    itemText += strTmp.PadLeft(1, nbsp);
                            }
                        }
                    }                itemText += typeName;                dr["typeName"] = itemText;            }
                return dtSource;       
            }
      

  11.   

    写了也太长,看下面的dom
    -------------
    CREATE TABLE tb(ID int,PID int,Name nvarchar(10))
    INSERT tb SELECT 1,NULL,'山东省'
    UNION ALL SELECT 2,1   ,'烟台市'
    UNION ALL SELECT 4,2   ,'招远市'
    UNION ALL SELECT 3,1   ,'青岛市'
    UNION ALL SELECT 5,NULL,'四会市'
    UNION ALL SELECT 6,5   ,'清远市'
    UNION ALL SELECT 7,6   ,'小分市'
    GO--节点复制处理函数
    CREATE FUNCTION f_CopyNode(
    @ID     int,      --复制此节点下的所有子节点
    @PID   int,       --将@ID下的所有子节点复制到此节点下面
    @NewID int=NULL   --新编码的开始值,如果指定为NULL,则为表中的最大编码+1
    )RETURNS @t TABLE(OldID int,ID int,PID int)
    AS
    BEGIN
    IF @NewID IS NULL
    SELECT @NewID=COUNT(*)+1 FROM TB
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT ID FROM tb
    WHERE PID=@ID
    OPEN TB
    FETCH tb INTO @ID
    WHILE @@FETCH_STATUS=0
    BEGIN
    INSERT @t VALUES(@ID,@NewID,@PID)
    SET @NewID=@NewID+1
    IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
    BEGIN
    --递归查找当前节点的子节点
    DECLARE @PID1 int
    SET @PID1=@NewID-1
    INSERT @t SELECT * FROM f_CopyNode(@ID,@PID1,@NewID)
    SET @NewID=@NewID+@@ROWCOUNT  --排序号加上子节点个数
    END
    FETCH tb INTO @ID
    END
    RETURN
    END
    GO--调用函数将节点1下面的所有子节点复制到节点5下面
    INSERT tb(ID,PID,Name)
    SELECT a.ID,a.PID,b.Name
    FROM f_CopyNode(1,5,DEFAULT) a,tb b
    WHERE a.OldID=b.ID
    SELECT * FROM tb
    /*--结果
    ID          PID         Name       
    ---------------- ----------------- ---------- 
    1           NULL        山东省
    2           1           烟台市
    4           2           招远市
    3           1           青岛市
    5           NULL        四会市
    6           5           清远市
    7           6           小分市
    8           5           烟台市
    10          5           青岛市
    9           8           招远市
    --*/
      

  12.   

    首先产生一级根目录
    select * from T where HHHType=1 ordey by HHHno ASC;
    循环N级
    for(int i=0;i<count;i++)
    {
       int x=Amount(x,y)
      while(x>0)
    {产生子级目录吧
    }   
       
       
    }
    定义一个方法,传一个目录参数和级别数数Amount(int m,int n)
    select * from T where HHHType like m%' and HHHno=(n+1);
      

  13.   

    (问题有二)
    第一:数据结构问题在你的应用中id都是“浪费的”字段
    有父子关系应该建表明父子关系的相应字段节点(比如:ID,PID)第二:实现代码问题这显然是一个递归,写一个递归函数即可
      

  14.   

    把<a>aaa</a>改为aaa用正则表达式谁会做啊 ```
      

  15.   

    用datatable全部读出,然后用table.Select("HHHno = '"+id+"'")
    的方法在遍历中选出需要的节绑定就可以了,对数据做递归遍历。