日期:2014-05-17  浏览次数:20374 次

通过某一列的值的规律实现分层,类似树,求解决方案。详见内容。
文本格式比较乱,效果见下面图片。



比如我有一个DataTable是这样的:
key code v
--------------------
101 NULL  
10101 NULL
102 B102
10201 B10201
1020101 B1020101
102010101 NULL
1020102 B1020102
102010201 NULL
1020103 B1020103
102010301 B102010301
102010302 NULL
---------------------

其中v字段在数据分层之前是没有值的。

第一个问题是:
我要得到这样的层级结构的DataTable(层级加缩进或空格等):

key code v
----------------------------------------------
101 NULL 0
10101 NULL 0
102 B102 0
10201 B10201 1
1020101 B1020101 1
102010101 NULL 1
1020102 B1020102 1
102010201 NULL 1
1020103 B1020103 0
102010301 B102010301 1
102010302 NULL 0
----------------------------------------------

第二个问题是:

如上面的层级结构。
当分层的时候,v字段得到的值有三种情况:
1.例如最底层的102010302的code是NULL,那么,它的v则为0。而它的上一级即1020103不论它的code是否为NULL,只要它的下级有一个以上为NULL,那么它的v都为0,否则为1。
2.例如1020101和1020102,因为它们都有下级,所以,当它们的code不为NULL时,又不属于第1种情况,即它的下一级的code全部为NULL或全不为NULL,那么它的v都为1,否则为0。
3.例如最顶级的101和102,只要它的下级节点出现有v为0的情况,那么,它的v都为0,否则为1。


以上实现用C#实现,不是用SQL实现。谢谢。
求解。
完。








------解决方案--------------------
根据你提供的数据,我认为可以采用repeater嵌套来实现,
------解决方案--------------------
我有绑定数据库绑定Treeview的例子你可以看看(无限极):地址
------解决方案--------------------
C# code


DECLARE  @TABLE TABLE   (
[KEY] VARCHAR(11),
CODE VARCHAR(11),
V VARCHAR(11)
)
INSERT @TABLE
SELECT 
'101', 'NULL', 0 UNION ALL
SELECT 10101 ,NULL, 0  UNION ALL
SELECT 102, 'B102', 0  UNION ALL
SELECT 10201 ,'B10201' ,1  UNION ALL
SELECT 1020101, 'B1020101' ,1 UNION ALL
SELECT 102010101    , NULL, 1 UNION ALL
SELECT  1020102 ,'B1020102', 1 UNION ALL
SELECT  102010201,     NULL, 1 UNION ALL
SELECT 1020103 ,'B1020103', 0 UNION ALL
SELECT  102010301,' B102010301', 1  

SELECT *,reverse( SUBSTRING( reverse([key]),charindex('0', reverse([key]))+1,100)) LASTCHARINDEX FROM @TABLE

------解决方案--------------------
看了一下数据,我是这样想的初始化的最低都是3位也就是101,102,103,并且每次增长后都是后面添加2位。
首先判断 对应值是否为空
101 NULL
10101 NULL
102 B102
10201 B10201
1020101 B1020101
102010101 NULL
1020102 B1020102
102010201 NULL
1020103 B1020103
102010301 B102010301
102010302 NULL
找到为空的之后,将字符串减少两位,判断是否有包含的,如果有包含的就继续再减两位,直到至少有3位
我是这样理解的。
------解决方案--------------------
楼主应该多多想想别人怎么作的。

其实这么排,就是在原来的数据前面加上N个空格或者制表符。

这里的数据非常有规律,key的长度除以2就是它所在的层次。

加上N个空格或者制表符形成了新的key的数据,直接绑定一下就出来了。