如下DataTable,其中有Id列、父Id列和内容Item列,具体数据如下:Id    Pid    Item
1      0      A
2      1      B
3      1      C
4      2      D
5      2      E
6      3      F
7      3      G
8      3      H请问如何通过遍历以上DataTable得到下面形式的字符串?A>B>D;A>B>E;A>C>F;A>C>G;A>C>H下面是DataTable对应的树型结构:            A
         /     \
       B         C
     /  \     /  |  \
    D    E   F   G   H

解决方案 »

  1.   

     class PlayNode
        {
            public int ID;
            public int PID;
            public string NAME;
            public PlayNode(int _ID, int _PID, string _NAME)
            {
                this.ID = _ID;
                this.PID = _PID;
                this.NAME = _NAME;
            }
        }
        public class Play
        {
            SortedDictionary<int, PlayNode> Lst = new SortedDictionary<int, PlayNode>();
            
                    void ReadNode()
            {
                Lst.Clear();
                string sqlData = "SELECT * FROM PLAY order by id";
                DataTable dtDate = DataSQL.Select(sqlData);
                if (dtDate != null)
                {
                    for (int i = 0; i < dtDate.Rows.Count; i++)
                    {
                        Lst.Add(int.Parse(dtDate.Rows[i]["ID"].ToString().Trim()),new PlayNode(int.Parse(dtDate.Rows[i]["ID"].ToString().Trim()),int.Parse(dtDate.Rows[i]["PID"].ToString().Trim()),dtDate.Rows[i]["NAME"].ToString().Trim()));
                    }
                }            
            }        public string Display()
            {
                string Outstr = "";
                ReadNode();
                if (Lst.Count != 0)
                {
                    string sqlData = "SELECT * FROM PLAY  where pid in (2,3) order by id";
                    DataTable dtDate = DataSQL.Select(sqlData);
                    if (dtDate != null)
                    {
                        for (int i = 0; i < dtDate.Rows.Count; i++)
                        {
                           Outstr +=DG(int.Parse(dtDate.Rows[i]["PID"].ToString().Trim()), dtDate.Rows[i]["NAME"].ToString().Trim(), Lst)+";";
                        }
                    }            
                }
                return Outstr;
            }        string DG(int PID, string LastStr, SortedDictionary<int, PlayNode> Dict)
            {
                if (PID != 0)
                {
                    int TmpID = PID;
                    string TmpLast = LastStr;
                    foreach (KeyValuePair<int, PlayNode> KP in Dict)
                    {
                        if (PID == KP.Key)
                        {
                            TmpLast = KP.Value.NAME + ">"+TmpLast;
                            TmpID = KP.Value.PID ;
                            break;
                        }
                    }
                    return DG(TmpID, TmpLast, Dict);               
                }
                else return LastStr;
            }
        }直接调用Display()方法即可
      

  2.   

    递归
        public void CreateTree(int parentID, TreeNode node, DataTable dt, TreeView treeView)  
        {  
            //实例化一个DataView dt = 传入的DataTable   
            dv = new DataView(dt);  
            //筛选(相当于select * from tabMenu where menuParentID = 传入的 parentID)   
            dv.RowFilter = "[menuParentID]=" + parentID;  
      
            //用foreach遍历dv   
            foreach (DataRowView row in dv)  
            {  
                //第一次加载时为空   
                if (node == null)  
                {  
                    //创建根节点   
                    TreeNode root = new TreeNode();  
                    //必须与数据库的对应   
                    root.Text = row["menuName"].ToString();  
                    root.Value = row["menuID"].ToString();  
                    //添加根节点   
                    this.TreeView1.Nodes.Add(root);  
                    //递归调用方法本身   
                    CreateTree(int.Parse(row["menuID"].ToString()), root, dt, treeView);  
      
                }  
                else  
                {  
                    //添加子节点   
                    TreeNode childNode = new TreeNode();  
                    childNode.Text = row["menuName"].ToString();  
                    childNode.Value = row["menuID"].ToString();  
                    node.ChildNodes.Add(childNode);  
                    CreateTree(int.Parse(row["menuID"].ToString()), childNode, dt, treeView);  
      
                }  
            }  
      
        }  
    }
    类似
      

  3.   


    错误 1 当前上下文中不存在名称“DataSQL”
      

  4.   


    与绑定TreeView有类似之处,但绑定TreeView是添加子节点,父节点只会出现一次;而现在问题在于,有多少个子节点,父节点就会出现多少次。
      

  5.   

    换了下思路,终于还是实现了。/// <summary>
            /// 根据DataTable中的数据得到特定规则的字符串
            /// </summary>
            /// <param name="dt">DataTable对象</param>
            /// <returns>特定规则的字符串</returns>
            public static string GetString(DataTable dt)
            {
                string strList = string.Empty;
                //先对DataTable表中的数据进行整理
                ManageDataTable(dt);            //对DataTable按Id进行升序排列
                DataView dv = new DataView(dt);
                dv.Sort = "Id";
                dt = dv.ToTable();            //循环调用递归方法组合专利分类字符串
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    strList += dt.Rows[i]["Item"].ToString();
                    GetString(ref strList, dt, i);
                    dt.Rows.RemoveAt(i);//移除组合后的项
                    i--;//循环变量相应减1
                    strList += ";";
                }            return strList;
            }        /// <summary>
            /// 整理DataTable表中的数据(使父分类的数量等于子分类之和)
            /// </summary>
            /// <param name="dt">DataTable对象</param>
            private static void ManageDataTable(DataTable dt)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    int pIdCount = 1;
                    int idCount = 0;                for (int j = i + 1; j < dt.Rows.Count; j++)
                    {
                        if (dt.Rows[i]["Pid"].ToString() == dt.Rows[j]["Pid"].ToString())
                        {
                            pIdCount++;
                        }                    if (dt.Rows[i]["Pid"].ToString() == dt.Rows[j]["Id"].ToString())
                        {
                            idCount++;
                        }
                    }                if (pIdCount <= idCount)
                    {
                        continue;
                    }                for (int l = 0; l < dt.Rows.Count; l++)
                    {
                        if (dt.Rows[i]["Pid"].ToString() == dt.Rows[l]["Id"].ToString())
                        {
                            for (int k = 0; k < pIdCount - idCount; k++)
                            {
                                DataRow dr = dt.Rows[l];
                                dt.ImportRow(dr);//重复添加
                            }                        i += pIdCount - 1;
                            break;
                        }
                    }
                }
            }        /// <summary>
            /// 递归组合字符串
            /// </summary>
            /// <param name="categoryList">初始字符串</param>
            /// <param name="dt">DataTable对象</param>
            /// <param name="rowIndex">初始行号</param>
            private static void GetString(ref string categoryList, DataTable dt, int rowIndex)
            {
                for (int i = rowIndex + 1; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[rowIndex]["Id"].ToString() == dt.Rows[i]["Pid"].ToString())
                    {
                        categoryList += "〉" + dt.Rows[i]["Item"].ToString();
                        GetString(ref categoryList, dt, i);//递归调用自身
                        dt.Rows.RemoveAt(i);//移除组合后的项
                        i--;//循环变量相应减1
                        break;
                    }
                }
            }