版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明
作者:xixi
出处:http://blog.csdn.net/slowgrace/archive/2008/12/08/3474159.aspx
数据结构的设计分两个方面:一方面是在数据库里如何保存有关树和树节点的信息;一方面是在treeview控件上如何安排node的key, tag, 和text。
1.节点表和节点细节表
一棵树下可能同时存在多种不同性质的节点,比如,在资源管理器的树中,同时存在文件夹和文件两种节点,它们各自对应不同的属性。如何在数据库中管理这些位于同一棵树下但具有不同数据结构的信息呢?
初步思路是,在节点表中设置strDetailTable和lngDetailId字段,存储节点对应的细节信息所在的表的名字和在其中的ID。即,节点基本信息在节点表(又称树表)中,节点细节信息根据不同的类型存在另外的相应的节点细节表中。这样要找一个节点的细节信息,只要到strDetailTable字段规定的表中找相应记录就可以了。相应的,删除节点的时候,要同时删节点表和节点细节表中的记录。
注意:节点表与树是一一对应的,有几种树就有几张节点表;而由于多挂节点的存在,节点细节表和节点表是一对多的关系,就是,同一细节可能在不同节点表里都存在相应的节点,在同一节点表里也可能存在不止一条记录具有同样的细节。
1.1.节点表的字段
1.lngNodeId
2.lngFatherId:记录它的父节点的节点ID
3.strDetailTable:该节点的细节表名
4.lngDetailId:该节点的细节ID
5.sngValue,用来记录本节点的所有子节点的金额之和;
6.sngPercent,用来记录本节点的金额占父节点金额的百分比。
7.strNodeComment
为了让所有节点的总金额有地方存放,于是在表中加一个虚拟的根节点,作为lngNodeId为1的节点,其sngValue存的是所有节点的总金额,sngPercent为100%,lngFatherId为0,节点名为该节点表名。有关金额和百分比的信息,见http://blog.csdn.net/slowgrace/archive/2009/04/16/4084636.aspx。
注意:这里没有节点名字字段,节点名要到相应的细节表去查(这个设计时也先后改了多次)。
1.2.节点细节表的字段
a)lngId
b)strName
c)strComments
d)bytRef:多挂计数,缺省为1
e)sngValue:仅当为基础节点时,才有该字段,见http://blog.csdn.net/slowgrace/archive/2009/04/16/4084636.aspx。
2.treeview节点属性信息的安排
node有3个可用来存储节点相关信息的属性:text、key、tag。
2.1 text
I store the strNodeName in newNode.text since it is text which is displayed before users, so a meaningful Node name is more user-friendly. 另外,树的根节点的text等于树表的名称。另外,对于需要显示百分比和/或金额的树,还包含金额标志位和百分比标志位,形式为:名字-金额-百分比。如:名字-98-1%。
2.2 key
Key is a more safe way to refer to a node object than index, as index can be dynamically changed. I store nodeId in newNode. Key since key require a unique string and nodeId is unique for each node==each record. And because node.key can't be given a string contains only number, to get the real nodeId use Node2Id(nodex).
2.3 tag
放的是见光标志位,取值字母Y或N,标识该节点是否见过光,见过光的节点的儿子节点也就生成过了,这是为了防止反复添加儿子节点引起运行时错误。
另外,想加个限定标志位,规定它以下的基础节点的一些字段的取值。比如在蔬菜底下添的食材的购买地点都在蔬菜、营养成份都是蔬菜等等。暂缓。
更多树类文章