即兴而抒

九十春光一掷梭,花前酌酒唱高歌。枝上花开能几日,世上人生能几何。 好花难种不长开,少年易过不重来。人生不向花前醉,花笑人生也是呆。 --明·唐寅 <<花下酌酒歌>>   
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

得到数据表所有类别,无限级,树形结构

Posted on 2009-06-08 18:10  pony  阅读(323)  评论(1)    收藏  举报


        /// <param name="tbs">树形结构数据源</param>
        /// <param name="idFaildName">梆定列的Key</param>
        /// <param name="catFaildName">梆定列的Value</param>
        /// <param name="parentFaildName">数据源中表示父结点的字段名称</param>
        /// <returns></returns>
        public static DataTable GetTypeTree(DataTable tbs, string idFaildName, string catFaildName, string parentFaildName)
        {
            DataTable tb = new DataTable();
            tb.Columns.Add(idFaildName, Type.GetType("System.String"));
            tb.Columns.Add(catFaildName, Type.GetType("System.String"));

            //Level,指定层级,加入新row时根据其上层row加一
            tb.Columns.Add("Level", Type.GetType("System.Int32"));
            DataRow row;

            //先将顶级菜单放入tb
            DataRow[] TopRows = tbs.Select(parentFaildName.ToString() + @" = '0'");
            for (int i = 0; i < TopRows.Length; i++)
            {
                row = tb.NewRow();

                row[0] = TopRows[i][idFaildName].ToString();
                row[1] = TopRows[i][catFaildName].ToString();
                row[2] = 0;

                tb.Rows.Add(row);
            }

            DataRow[] rows;
            for (int i = 0; i < tb.Rows.Count; i++)
            {
                string strSpace = "";
                for (int j = 0; j < Convert.ToInt32(tb.Rows[i][2]); j++)
                {
                    strSpace += "  ";
                }
                rows = tbs.Select(parentFaildName + "=" + "'" + tb.Rows[i][0].ToString() + "'");
                for (int j = rows.Length - 1; j >= 0; j--) //倒循环,结果可以正序
                {
                    row = tb.NewRow();

                    row[0] = rows[j][idFaildName].ToString();
                    row[1] = strSpace + "--" + rows[j][catFaildName].ToString();
                    row[2] = Convert.ToInt32(tb.Rows[i][2]) + 1;

                    tb.Rows.InsertAt(row, i + 1);
                }
            }
            return tb;
        }