帮老婆大人写的无限分级代码,主要用到了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);
}
}
}
演示:
中国
--山东
----潍坊
----青岛
--北京
----中关村
