红雪中国

企业级开发
posts - 10, comments - 56, trackbacks - 0, articles - 0

使用DataSet返回树形结构

Posted on 2009-05-05 09:49 红雪中国 阅读(341) 评论(1) 编辑 收藏

帮老婆大人写的无限分级代码,主要用到了DataTable.Select查询

表结构

USE [Test_DB]
GO
/****** 对象:  Table [dbo].[ClassTable]    脚本日期: 04/19/2009 13:54:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ClassTable](
 [Id] [int] IDENTITY(1,1) NOT NULL,
 [Title] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [ParentId] [int] NULL CONSTRAINT [DF_ClassTable_ParentId]  DEFAULT ((0)),
 [ChildId] [int] NULL CONSTRAINT [DF_ClassTable_ChildId]  DEFAULT ((0)),
 [Depth] [int] NULL CONSTRAINT [DF_ClassTable_Depth]  DEFAULT ((0))
) ON [PRIMARY]

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'类别深度' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'ClassTable', @level2type=N'COLUMN', @level2name=N'Depth'


调用代码:
protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection("server=.;database=Test_DB;uid=sa;pwd=sa;");
        SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM ClassTable WHERE Id IS NOT NULL", conn);
        //将数据放入DataSet
        DataSet ds = new DataSet();
        myAdapter.Fill(ds);

        if(ds!=null&&ds.Tables[0].Rows.Count>0)
        {
            //获取数据为PaterId=0的数据
            DataRow[] drs = ds.Tables[0].Select("ParentId=0");

            GetClassList(ds, drs,"|--");
        }
    }

    /// <summary>
    /// 递归调用并返回DataSet
    /// </summary>
    /// <param name="ds">DataSet</param>
    /// <param name="drs">DataRow[]</param>
    /// <param name="signString">文本前面的符号</param>
    protected void GetClassList(DataSet ds,DataRow[] drs,string signString)
    {
        int childId = 0;
        string signList = string.Empty;
        int depth=0;

        foreach(DataRow dr in drs)
        {
            int.TryParse(dr["Depth"].ToString(),out depth);

            for (int i = 0; i < depth;i++ )
            {
                signList += signString;
            }
            //将数据写入
            Response.Write(signList+dr["Title"].ToString() + "<br>");

            int.TryParse(dr["ChildId"].ToString(), out childId);

            //检测是否有子类
            if (childId>0)
            {
                GetClassList(ds,ds.Tables[0].Select("ParentId="+dr["Id"].ToString()),signString);
            }
        }
    }

演示:
中国
--山东
----潍坊
----青岛
--北京
----中关村