问题说明:
在获取数据库记录数据的时候, 通常返回的ArrayList集合, 没有了层次关系. 如果每次根据PID重新到数据库获取记录, 可以做到, 但有以下几个缺点:

1. 访问数据库记录次数随着记录的增多而增多

2. 由于需要多次访问数据库, 因此访问速度受影响

3. 需要数据库访问层的支持, 并对记录进行转化, 耦合性太强

4. 通用性不好, 每次需要一个新的类型列表, 就需要重新编写
解决方法:
我根据原有的树状结构算法代码, 编写一个通用的算法, 利用反射原理, 递归的对数据进行筛选.

这样只需要访问数据库一次, 然后就在内存中遍历, 而且适合于所有具有(PID, ID, Name)属性的实体类集合的排序.


如我需要生成设备类型实体类集合的树状结构时候, 代码如下:


ArrayList equipTypelist
=
equipmentType.GetAll();

equipTypelist

=
CollectionHelper.GetTreeItems(equipTypelist);

this
.ddlEquipmentTypes.DataSource
=
equipTypelist;

this
.ddlEquipmentTypes.DataTextField
=

"
Name
"
;

this
.ddlEquipmentTypes.DataValueField
=

"
ID
"
;

this
.ddlEquipmentTypes.DataBind();


this
.ddlEquipmentType.Items.Insert(
0
,
new
ListItem(
"
(全部)
"
,
"
0
"
));




public

class
CollectionHelper



{

private

static
ArrayList Fill(
int
pID,
int
level, ArrayList list)



{

ArrayList returnList

=

new
ArrayList();

foreach
(
object
obj
in
list)



{

int
typePID
=
(
int
)ReflectionUtil.GetProperty(obj,
"
PID
"
);

int
typeID
=
(
int
)ReflectionUtil.GetProperty(obj,
"
ID
"
);

string
typeName
=
ReflectionUtil.GetProperty(obj,
"
Name
"
)
as

string
;


if
(pID
==
typePID)



{

string
newName
=

new

string
(
'
-
'
, level
*

4
)
+
typeName;

ReflectionUtil.SetProperty(obj,

"
Name
"
, newName);

returnList.Add(obj);


returnList.AddRange(Fill(typeID, level

+
1
, list));

}



}



return
returnList;

}






///

<summary>


///
生成有层次结构的列表

///

</summary>


///

<param name="list">
具有Name,ID,PID成员的任何集合
</param>


///

<returns></returns>



public

static
ArrayList GetTreeItems(ArrayList list)



{

return
Fill(
-
1
,
0
, list);

}



}





public

sealed

class
ReflectionUtil



{

private
ReflectionUtil()



{ }



public

static
BindingFlags bf
=
BindingFlags.DeclaredOnly
|
BindingFlags.Public
|


BindingFlags.NonPublic

|
BindingFlags.Instance
|
BindingFlags.Static;


public

static

void
SetProperty(
object
obj,
string
name,
object
value)



{

PropertyInfo fi

=
obj.GetType().GetProperty(name, bf);

fi.SetValue(obj, value,

null
);

}




public

static

object
GetProperty(
object
obj,
string
name)



{

PropertyInfo fi

=
obj.GetType().GetProperty(name, bf);

return
fi.GetValue(obj,
null
);

}



}


效果图如下
树状列表效果图.jpg

标签: none

添加新评论