(无限级、递归)DropDownList显示树形分类
生活随笔
收集整理的這篇文章主要介紹了
(无限级、递归)DropDownList显示树形分类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單無限級表結構:id,name,pid。
本篇將展示如何在DropDownList控件顯示一個漂亮的樹結構。
1.以下我們建立無限級樹的表結構
--星辰變的修真等級表CREATE?TABLE XianMO
(
XianMoID INT?NOT?NULL ,
XianMoLevel VARCHAR(50) NOT?NULL?DEFAULT(''),
XianMoParentID INT?NOT?NULL?DEFAULT(0)
)
GO
--索引
CREATE?NONCLUSTERED?INDEX IX_XianMo ON XianMo(XianMoID)
GO
?
2.有了表結構,我們將添加一些數據。^_^
INSERT?INTO XianMo(XianMoID,XianMoLevel,XianMoParentID) SELECT?1,'凡人',0UNION?ALL?SELECT?2,'修真者',0
UNION?ALL?SELECT?3,'后天境界',2
UNION?ALL?SELECT?4,'先天境界(四九小天劫)',2
UNION?ALL?SELECT?5,'金丹期',2
UNION?ALL?SELECT?6,'元嬰期(六九大天劫)',2
UNION?ALL?SELECT?7,'洞虛期',2
UNION?ALL?SELECT?8,'空冥期',2
UNION?ALL?SELECT?9,'渡劫期(九九重劫)',2
UNION?ALL?SELECT?10,'大乘期',2
UNION?ALL?SELECT?11,'仙人',0
UNION?ALL?SELECT?12,'散仙',11
UNION?ALL?SELECT?13,'天仙',11
UNION?ALL?SELECT?14,'金仙',11
UNION?ALL?SELECT?15,'玄仙',11
UNION?ALL?SELECT?16,'仙帝',11
UNION?ALL?SELECT?17,'神人',0
UNION?ALL?SELECT?18,'下級神人',17
UNION?ALL?SELECT?19,'中級神人',17
UNION?ALL?SELECT?20,'上級神人',17
UNION?ALL?SELECT?21,'天神',0
UNION?ALL?SELECT?22,'下部天神',21
UNION?ALL?SELECT?23,'中部天神',21
UNION?ALL?SELECT?24,'上部天神',21
UNION?ALL?SELECT?25,'神王',0
UNION?ALL?SELECT?26,'天尊',0
UNION?ALL?SELECT?27,'鴻蒙',0
GO
?
3.創建一個存儲過程,我們在這里就已經把樹結構完整的展示出來了。
-- =============================================-- Author: Star Studio
-- Create date: 2010-09-10
-- Description: Tree In DropDownList
-- =============================================
ALTER?PROCEDURE[dbo].[GetTree]
@tableName?VARCHAR(100),--表名
@idName?VARCHAR(100),--id字段名
@className?VARCHAR(100),--class字段名
@pidName?VARCHAR(100),--父id字段名
@pidValue?INT,--指定此次構造樹的根節點
@idExcepted?INT--此次構造的樹,將排除顯示的節點及其子節點。這在修改節點的父關系時很有用。你不可以指定某節點的老爸是自己或自己的兒子吧。所以這時就要屏蔽掉自己及子節點
AS
BEGIN
SET NOCOUNT ON;
DECLARE?@Level?INT
DECLARE?@strTree?VARCHAR(8000)
DECLARE?@t?TABLE(id INT,class VARCHAR(100), pid INT)
DECLARE?@ttemp?TABLE(id INT,class VARCHAR(100),pid INT,lev INT,codeid VARCHAR(8000))
SET?@Level=0
SET?@strTree='┊┈┈'
INSERT?INTO?@t?EXEC('SELECT '+@idName+' AS id,'+@className+' AS class,'+@pidName+' AS pid FROM '+@tableName+'') --排除的節點有可能是根節點
INSERT?INTO?@ttemp?SELECT id,@strTree+class,pid,@level,right(10000+id,4) FROM@tWHERE pid=@pidValueAND id<>@idExcepted
WHILE?@@rowcount>0--一層層遞歸構造排序字段codeid
BEGIN
SET?@strTree=replace(@strTree,'┈','')
SET?@strTree=@strTree+'┊┈┈'
SET?@level=@level+1
IF(@idExcepted=0)
BEGIN
INSERT?@ttemp?SELECT a.id,@strTree+a.class,a.pid,@level,b.codeid+right(10000+a.id,4) FROM@t a,@ttemp b
WHERE a.pid=b.id AND b.lev=@level-1
END
ELSE
BEGIN --排除的節點是某個子節點
INSERT?@ttemp?SELECT a.id,@strTree+a.class,a.pid,@level,b.codeid+right(10000+a.id,4) FROM@t a,@ttemp b
WHERE a.pid=b.id AND b.lev=@level-1AND b.id<>@idExcepted
END
END --只要按codeid排列結果集,就能得到正確完整的樹結構
SELECT a.id,a.pid,b.class,b.lev,b.codeid FROM?@t a,@ttemp b WHERE a.id=b.id ORDERBY b.codeid
END
GO
--事例演示
exec gettree 'XianMo','xianmoid','xianmolevel','xianmoparentid',0,11
?
演示事例一及其結果集:
--不排除任何一個節點exec gettree 'XianMo','xianmoid','xianmolevel','xianmoparentid',0,0
?
?
演示事例二及其結果集:
--排除仙人節點exec gettree 'XianMo','xianmoid','xianmolevel','xianmoparentid',0,11
?
看了以上兩圖,你應該知道,該存儲過程的原理是通過遞歸構造一個排序字段codeid,然后根據codeid排序就得到完整的屬性排列了。
?
4.接下來只要把數據放入DropDownList,就能顯示一顆漂亮的樹了。
<!--DropDownListTree.aspx--><%@ Page Language="C#" AutoEventWireup="true" CodeFile="DropDownListTree.aspx.cs" Inherits="_Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>DropDownList顯示樹結構</title>
<style type="text/css">
#TreeBlock{width:200px;}
#TreeBlock #ddlXianMoTree{background-color:#FFAA2B; }
</style>
</head>
<body>
<form id="form1" runat="server">
<div id="TreeBlock">
<asp:DropDownList ID="ddlXianMoTree" runat="server"></asp:DropDownList>
</div>
</form>
</body>
</html>
?
//DropDownListTree.aspx.csusing System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using WnetSoft.Common.DBHelper;
publicpartialclass _Default : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
SqlParameter[] SqlParamList ={
SqlHelper.MakeInParam("@tableName",SqlDbType.VarChar,100,"XianMo"),
SqlHelper.MakeInParam("@idName",SqlDbType.VarChar,100,"XianMoID"),
SqlHelper.MakeInParam("@className",SqlDbType.VarChar,100,"XianMoLevel"),
SqlHelper.MakeInParam("@pidName",SqlDbType.VarChar,100,"XianMoParentID"),
SqlHelper.MakeInParam("@pidValue",SqlDbType.Int,10,0),
SqlHelper.MakeInParam("@idExcepted",SqlDbType.Int,10,0)
};
ddlXianMoTree.DataSource = SqlHelper.ExecuteReader(SqlHelper.connString, CommandType.StoredProcedure, "GetTree", SqlParamList);
ddlXianMoTree.DataTextField ="class";
ddlXianMoTree.DataValueField ="id";
ddlXianMoTree.DataBind();
ddlXianMoTree.Items.Insert(0, new ListItem("--根節點--", "0"));
}
}
?
有點遺憾是,我傳入XianMoID,XianMoLevel字段,返回的結果是id,class字段。
?
以上就是本篇內容。?
?
?
總結
以上是生活随笔為你收集整理的(无限级、递归)DropDownList显示树形分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2005两本教程案
- 下一篇: 分享几款linux的歌词插件