数据如图所示   我想实现如下图效果
  但是上面的图的三及菜单没在相应的二及菜单下` 
  应该怎么做?

解决方案 »

  1.   

    DataList嵌套一下就可以了
      

  2.   

     dataList 递归添加无限极分类,
      就解决这个问题,
     
      

  3.   

    这个用SQL写 很简单的,用Group by分组 在用 when case then eles 来做!
      

  4.   

    哦 现在看到了,用递归可以实现出你要的效果,给你个例子你参考下。。
    private void Bind()
        {        SqlConnection con = new SqlConnection("server=.;database=Office-DB;uid=sa;pwd=sa");
            SqlCommand com = new SqlCommand("select * from OA_Purview", con);
            SqlDataAdapter da = new SqlDataAdapter(com);
            DataSet ds = new DataSet();
            da.Fill(ds);
            //调用创建方法创建TreeView的根节点
            CreateTreeView(TreeView1.Nodes, ds, 0);
        }
    private void CreateTreeView(TreeNodeCollection nodes, DataSet ds, int pid)
        {
            //定义筛选条件
            string sql = string.Format("ParentID={0}", pid);        //从Dataset中筛选符合条件的行的集合
            DataRow[] drr = ds.Tables[0].Select(sql);        //遍历获得行的集合
            foreach (DataRow dr in drr)
            {
                //创建TreeView节点
                TreeNode tnode = new TreeNode();
                //添加到根节点中
                nodes.Add(tnode);
                //设置显示的文本
                //tnode.ImageUrl = "images/foldericon1.gif";
                tnode.Text = dr["PurName"].ToString();
                tnode.Value = dr["PurID"].ToString();
                //设置显示的路径
                tnode.NavigateUrl = dr["PurURL"].ToString();
                //递归调用方法
                CreateTreeView(tnode.ChildNodes, ds, Convert.ToInt32(dr["PurID"]));
                //从Dataset中删除已经添加的行,提高访问效率
                ds.Tables[0].Rows.Remove(dr);        }
        }
      

  5.   


    with    simplerecursive ( ModeName, ModeId, ParentID ,sublevel)
              as ( select   ModeName ,
                            ModeId ,
                            ParentID,
                            0
                   from     Mode
                   where    ModeId = 100
                   union all
                   select   p.ModeName ,
                            p.ModeId ,
                            p.ParentID,
                            sublevel + 1
                   from     Mode p
                            inner join simplerecursive a on a.ModeId = p.ParentID
                 )
        select  sr.ModeId as id ,
                sr.ModeName as [name] ,
                sr.ParentID as pid,
                sr.sublevel   
        from    simplerecursive sr
                inner join Mode et on sr.ParentID = et.ModeId
    select * from dbo.Mode
     这是我以前写的代码 但是就是不可以把3及的菜单 放在2及下 ``求帮助` 
    需用sql 来实现`
      

  6.   

    declare @T table(cid int ,pid int,nm varchar(20))
    insert into @T(cid,pid,nm)
    select 0,null,'上海'
    union
    select 1,0,'嘉定'
    union
    select 2,0,'长宁'
    union
    select 3,0,'黄浦'
    union
    select 4,0,'青浦'
    union
    select 5,0,'宝山'
    union
    select 6,0,'徐汇'
    union
    select 7,1,'安亭'
    union
    select 8,1,'黄渡'
    union
    select 9,1,'江桥'
    union
    select 10,5,'桃浦';with tb(cid,pid,nm,lv)
    as
    (
        select cid,pid,cast(replicate('--',0)+nm as varchar) nm,lv=0 from @T where cid=0
    union all 
    select a.cid,a.pid,cast(replicate('--',2*lv+2)+a.nm  as varchar) nm,b.lv+1 lv from @T a,tb b where a.pid=b.cid
    )
    select * from tb结果
    cid     pic     nm      lv
    0 NULL 上海 0
    1 0 ----嘉定 1
    2 0 ----长宁 1
    3 0 ----黄浦 1
    4 0 ----青浦 1
    5 0 ----宝山 1
    6 0 ----徐汇 1
    10 5 --------桃浦 2
    7 1 --------安亭 2
    8 1 --------黄渡 2
    9 1 --------江桥 2
      

  7.   

    上面在05里能直接出来,这个在2000里也能出来(牛人刚告诉我的)CREATE TABLE t1
    (
    model INT,
    ModelName VARCHAR(50),
    ParentId INT
    )INSERT INTO t1 VALUES(100,'商品管理',0)
    INSERT INTO t1 VALUES(101,'订单管理',0)
    INSERT INTO t1 VALUES(107,'商品管理',100)
    INSERT INTO t1 VALUES(108,'明细管理',100)SELECT m.model,m.parentid,m.modelName,CASE WHEN N.model IS NULL THEN '|-'+ m.modelname ELSE '  |-'+m.modelname END AS modelname,
    CASE WHEN N.model IS NULL THEN m.model ELSE m.parentid END AS sort,
    [LEVEL]=CASE WHEN N.Model IS NULL THEN 0 ELSE 1 END
    FROM t1 AS m LEFT OUTER JOIN t1 AS n ON m.parentid=n.model
      

  8.   

    哦,上面的格式不对用这个吧(来自邹建)
    --测试数据
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO--广度搜索排序函数
    CREATE FUNCTION f_Sort(@ID char(3)=NULL,@sort int=1)
    RETURNS @t_Level TABLE(ID char(3),sort int)
    AS
    BEGIN
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT ID FROM tb
    WHERE PID=@ID
    OR(@ID IS NULL AND PID IS NULL)
    OPEN TB
    FETCH tb INTO @ID
    WHILE @@FETCH_STATUS=0
    BEGIN
    INSERT @t_Level VALUES(@ID,@sort)
    SET @sort=@sort+1
    IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
    BEGIN
    --递归查找当前节点的子节点
    INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)
    SET @sort=@sort+@@ROWCOUNT  --排序号加上子节点个数
    END
    FETCH tb INTO @ID
    END
    RETURN
    END
    GO--显示结果
    SELECT a.*
    FROM tb a,f_Sort(DEFAULT,DEFAULT) b
    WHERE a.ID=b.ID
    ORDER BY b.sort
    --结果
    ID   PID   Name       
    ------ --------- ---------- 
    001  NULL 山东省
    002  001   烟台市
    004  002   招远市
    003  001   青岛市
    005  NULL 四会市
    006  005   清远市
    007  006   小分市
      

  9.   

    看了各位前辈写下来的方法 
    其实跟我另一个差不过 
     但是我把表名 和字段换了  查询的结果就不是我想要的了
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))   
    DECLARE @Level int  
    SET @Level=0   
    INSERT @t_Level SELECT ID,@Level,ID   
    FROM sssss   
    WHERE PID = 0  
    WHILE @@ROWCOUNT>0   
    BEGIN   
        SET @Level=@Level+1   
        INSERT @t_Level SELECT a.ID,@Level, b.ID  
        FROM sssss a,@t_Level b   
        WHERE a.PID=b.ID   
            AND b.Level=@Level-1   
    END   
       
    SELECT a.id,a.pid, SPACE(b.Level*6)+'|--'+a.Name,b.sort   
    FROM sssss a,@t_Level b   
    WHERE a.ID=b.ID   
    ORDER BY b.Sort,a.id 
      

  10.   


    with  simplerecursive ( ModeName, ModeId, ParentID ,sublevel)
              as ( select   ModeName ,
                            ModeId ,
                            ParentID,
                            0
                   from     Mode
                   where    ModeId = 100
                   union all
                   select   p.ModeName ,
                            p.ModeId ,
                            p.ParentID,
                            sublevel + 1
                   from     Mode p
                            inner join simplerecursive a on a.ModeId = p.ParentID
                 )
        select  sr.ModeId as id ,
                sr.ModeName as [name] ,
                sr.ParentID as pid,
                sr.sublevel   
        from    simplerecursive sr
                inner join Mode et on sr.ParentID = et.ModeId
    可不可以在这个方法上面修改 ` 谢谢拉`
      

  11.   


    with    simplerecursive ( employee_nm, employee_id, reportsto ,sublevel)
              as ( select   employee_nm ,
                            employee_id ,
                            reportsto,
                            0
                   from     employee_tree
                   where    employee_id = 2
                   union all
                   select   p.employee_nm ,
                            p.employee_id ,
                            p.reportsto,
                            sublevel + 1
                   from     employee_tree p
                            inner join simplerecursive a on a.employee_id = p.reportsto
                 )
        select  sr.employee_id as id ,
                sr.employee_nm as empname ,
                sr.reportsto as   pid ,
    sr.sublevel   
        from    simplerecursive sr
                inner join employee_tree et on sr.reportsto = et.employee_idcreate table employee_tree
        (
          employee_nm nvarchar(50) ,
          employee_id int primary key ,
          reportsto int
        )insert  into employee_tree
    values  ( 'richard', 1, null )
    insert  into employee_tree
    values  ( 'stephen', 2, 1 )
    insert  into employee_tree
    values  ( 'clemens', 3, 2 )
    insert  into employee_tree
    values  ( 'malek', 4, 2 )
    insert  into employee_tree
    values  ( 'goksin', 5, 4 )
    insert  into employee_tree
    values  ( 'kimberly', 6, 1 )
    insert  into employee_tree
    values  ( 'ramesh', 7, 5 )
    insert  into employee_tree
    values  ( 'aaaaa', 8, 2 )
      为什么这个可以` 把它换成我的表就不可以了 
      

  12.   

    标注下,以后看,都是用treeview,没用过sql语句实现过,参考下,
      

  13.   


      我要根据一及菜单找二三及菜单 怎么做  ?
      有谁知道吗` 
      最好是sql 语句
      

  14.   

    建议你把你的贴 放到SQL区去  那里的高手很多!
      

  15.   

    我做过你说的功能,不过表结构和你的不一样。你这种一时还真想不到该怎么用sql做出来
      

  16.   

    我对2000比较熟,写了个实现,你测一下吧。我就测了三层的
    CREATE TABLE t1
    (
    model INT,
    ModelName    VARCHAR(50),
    ParentId    INT
    )
    INSERT INTO t1 VALUES(100,'商品管理',0)
    INSERT INTO t1 VALUES(101,'订单管理',0)
    INSERT INTO t1 VALUES(107,'商品管理',100)
    INSERT INTO t1 VALUES(108,'明细管理',100)
    INSERT INTO t1 VALUES(109,'明细管理',107)
    alter function getDep(@model int )
    returns varchar(200)
    as
    begin
    declare @returns varchar(200)
    Set @returns='┝'
    declare @temp int
    set @temp= (select ParentId from t1 where model=@model)
    while(@temp<>0)
    begin
    set @returns='  '+@returns
    set @temp=(select ParentId from t1 where model=@temp)
    end
    return @returns
    endalter function getbb(@model int )
    returns varchar(200)
    as
    begin
    declare @returns varchar(200)
    set @returns=@model
    declare @temp varchar(200)
    set @temp= (select ParentId from t1 where model=@model)
    while(@temp<>0)
    begin
    set @returns=Convert(varchar(200),@temp)+Convert(varchar(200),@model)
    set @model=@returns
    set @temp=(select ParentId from t1 where model=@temp)
    end
    return @returns
    end
    select *,dbo.getDep(model)+ModelName from t1 order by dbo.getbb(model)
      

  17.   

    Quote=引用 38 楼 fuda_1985 的回复:]
    晕倒。十三号的贴!看来回答晚了嘛~~~
    最近不怎么逛技术区哎!~
    [/Quote][消息 208,级别 16,状态 6,过程 getbb,第 15 行
    对象名 'getbb' 无效。

     不行啊` 代码不可以执行 
      

  18.   

    看看这个了,还没解决啊create table test
    (
        indexid int,
        textvalue nvarchar(20),
        parentid int
    )--插入一些测试数据:insert into test values(1,'10',0)
    insert into test values(2,'20',0)
    insert into test values(3,'30',0)
    insert into test values(4,'40',0)
    insert into test values(5,'50',0)
    insert into test values(10,'100',1)
    insert into test values(11,'110',1)
    insert into test values(12,'120',1)
    insert into test values(100,'1000',10)
    insert into test values(110,'1100',10)
    insert into test values(120,'1200',10)
    insert into test values(130,'1300',10)
    insert into test values(1000,'10000',100)
    insert into test values(1100,'11000',100)
    insert into test values(1200,'12000',100)
    insert into test values(1300,'13000',100)
    insert into test values(20,'200',2)
    insert into test values(21,'210',2)
    insert into test values(22,'220',2)
    insert into test values(200,'2000',20)
    insert into test values(210,'2100',20)--执行测试Sql语句:GO
    WITH DirectReports (indexid, textvalue,parentid,Level)
    AS
    (
        SELECT e.indexid, e.textvalue,e.parentid, 0 AS Level
        FROM test AS e where indexid=1 --起始节点
        UNION ALL
        SELECT e.indexid, e.textvalue,e.parentid,Level + 1
        FROM test AS e
        INNER JOIN DirectReports AS d
            ON e.parentid = d.indexid
    )
    SELECT indexid, textvalue,parentid,Level FROM DirectReports
    GO
      

  19.   

     我重新把问题说下把` 
        我查询的是某一个模块下的二三级菜单  并有一定的规律 
      结果要如下 
        id  name  pid 
        1    aa    0
        2    bb    1
        3    cc    2
        4    dd    1
        5    ee    4
        6    ff    5
     13楼的代码是把所有的结果多例出来了 ` 
     但我要的是某一模块下的  二三级菜单 谁可以修改下 
     我对游标不太懂 
      

  20.   


    [消息 208,级别 16,状态 6,过程 getbb,第 15 行
    对象名 'getbb' 无效。
     不行啊` 代码不可以执行
    [/Quote]
    晕啊。是肯定可以的。我告诉你吧。先将这两个方法执行一下。create function getDep(@model int )
    returns varchar(200)
    as
    begin
        declare @returns varchar(200)
        Set @returns='┝'
        declare @temp int
        set @temp= (select ParentId from t1 where model=@model)
        while(@temp<>0)
            begin
                set @returns='  '+@returns
                set @temp=(select ParentId from t1 where model=@temp)
            end
        return @returns
    endcreate function getbb(@model int )
    returns varchar(200)
    as
    begin
        declare @returns varchar(200)
        set @returns=@model
        declare @temp varchar(200)
        set @temp= (select ParentId from t1 where model=@model)
        while(@temp<>0)
            begin
                set @returns=Convert(varchar(200),@temp)+Convert(varchar(200),@model)
                set @model=@returns
                set @temp=(select ParentId from t1 where model=@temp)
            end
        return @returns
    end
    注意将里面的表名换成你自己数据库的表名。
    然后alter换成create
    查询的时候select dbo.getDep(model)+ModelName from t1 order by dbo.getbb(model)
    表名也换成你的。
    我这边就是在05里测试的。
    本质和别人的差不多。只不过你们写的是使用了05特有的递归办法。我这里写了两个方法做循环。
      

  21.   

    看一下,调用方法的时候。要带上dbo.
      

  22.   

    ...你将我的方法改成你自己的表名和字段分别执行一次。。再调用就完了,我这边测着挺好的嘛。你别说不会使用function啊?
      

  23.   


     我还没学过哪个function 我还以为是JS里面的 
      

  24.   

    create TABLE t1
    (
    model INT,
    ModelName    VARCHAR(50),
    ParentId    INT
    )
    INSERT INTO t1 VALUES(100,'商品管理',0)
    INSERT INTO t1 VALUES(101,'订单管理',0)
    INSERT INTO t1 VALUES(107,'商品管理',100)
    INSERT INTO t1 VALUES(108,'明细管理',100)
    INSERT INTO t1 VALUES(109,'分类1',107)
    INSERT INTO t1 VALUES(110,'分类2',107)
    INSERT INTO t1 VALUES(111,'明细1',108)
    INSERT INTO t1 VALUES(112,'产品1',109)
    -------------------------------------------------------------------
    --上面单独执行create function getDep(@model int )
    returns varchar(200)
    as
    begin
        declare @returns varchar(200)
        Set @returns='┝'
        declare @temp int
        set @temp= (select ParentId from t1 where model=@model)
        while(@temp<>0)
            begin
                set @returns='  '+@returns
                set @temp=(select ParentId from t1 where model=@temp)
            end
        return @returns
    end
    --上面单独执行create function getbb(@model varchar(200) )
    returns varchar(200)
    as
    begin
        declare @returns varchar(200)
        set @returns=@model
        declare @temp varchar(200)
        set @temp= (select ParentId from t1 where model=@model)
        while(@temp<>0)
            begin
                set @returns=Convert(varchar(200),@temp)+Convert(varchar(200),@model)
                set @model=@returns
                set @temp=(select ParentId from t1 where model=@temp)
            end
        return @returns
    end--上面单独执行select *,dbo.getDep(model)+ModelName from t1 order by dbo.getbb(model)-----------------------------------------------------------------------------
    drop table t1
    drop function getDep
    drop function getbb
    --上面单独执行,删除测试
    最后再给你将说明弄着,要是再不会用没办法了。
      

  25.   

    getDep 这个游标是可以不要的`` 
      

  26.   

    ...是function,我用到的东西没有游标。
    只是用到了循环!!!
      

  27.   

    getDep 
    这个方法只是为了实现你一楼要的那个无列名的输出
      

  28.   


      请问一下   只可以这样调用吗 
     select * from mode order by dbo.getbb(ModeId)
     不可以
    select * from mode order by dbo.getbb(100)   我不是把所有的结果都查出来的啊??
      我只要ID为100子菜单下的子菜单啊` 
     
      

  29.   

    select * from mode where dbo.getbb(ModeId) like '100%' order by dbo.getbb(ModeId)
    这样就行了
      

  30.   

    竟然结帖了if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([modeid] int,modename varchar(20),parentid int)
    insert [tb]
    select 100 ,'商品管理', 0 union all
    select 101 ,'定单管理', 0 union all
    select 102 ,'用户管理', 0 union all
    select 104 ,'学院广告', 0 union all
    select 105 ,'系统设置', 0 union all
    select 106 ,'附件管理', 0 union all
    select 107 ,'商品管理', 100 union all
    select 108 ,'明细管理', 100 union all
    select 109 ,'物流管理', 100 union all
    select 110 ,'商品信息管理', 107 union all
    select 111 ,'商品分类管理', 107 union all
    select 112 ,'回收站管理', 107 union all
    select 114 ,'团购管理', 108 union all
    select 115 ,'拍卖管理', 108 union all
    select 116 ,'优惠管理', 108 union all
    select 117 ,'会员管理', 102 union all
    select 118 ,'会员卡管理', 102 union all
    select 119 ,'资金管理', 102 union all
    select 120 ,'管理员管理', 102 union all
    select 121 ,'添加管理员', 120 union all
    select 122 ,'修改管理员', 120
    go
    --查所有子结点
    if object_id('f_getC') is not null drop function f_getC
    go
    create function f_getC(@id int)  
    returns @re table(id int,level int,sort varchar(10))  
    as  
    begin
        declare @l int  
        set @l=0  
        insert @re select @id,@l,null
        while @@rowcount>0
        begin  
            set @l=@l+1
            insert @re select a.modeid,@l,ltrim(isnull(b.sort,a.modeid)) from tb as a,@re as b  
    where b.id=a.parentid and b.level=@l-1
        end
        update @re set level = level -1
        return  
    end  
    go  
    select a.modeid,a.parentid,REPLICATE('  ',b.level) +'┝'+a.modename,b.level,b.sort from tb  a,f_getC(0) b  
    where a.modeid=b.id  
    order by case when b.level<2 then 0 else 1 end,b.sort,b.level/*
    modeid      parentid                                                       sort       level       
    ----------- ----------- -------------------------------------------------- ---------- ----------- 
    100         0           ┝商品管理                                              100        0
    107         100           ┝商品管理                                            100        1
    108         100           ┝明细管理                                            100        1
    109         100           ┝物流管理                                            100        1
    101         0           ┝定单管理                                              101        0
    102         0           ┝用户管理                                              102        0
    117         102           ┝会员管理                                            102        1
    118         102           ┝会员卡管理                                           102        1
    119         102           ┝资金管理                                            102        1
    120         102           ┝管理员管理                                           102        1
    104         0           ┝学院广告                                              104        0
    105         0           ┝系统设置                                              105        0
    106         0           ┝附件管理                                              106        0
    110         107             ┝商品信息管理                                        100        2
    111         107             ┝商品分类管理                                        100        2
    112         107             ┝回收站管理                                         100        2
    114         108             ┝团购管理                                          100        2
    115         108             ┝拍卖管理                                          100        2
    116         108             ┝优惠管理                                          100        2
    121         120             ┝添加管理员                                         102        2
    122         120             ┝修改管理员                                         102        2(所影响的行数为 21 行)*/