''''======================================================= ''''===efei Super TreeView ''''===Code By efei(草不含羞) ''''===Mailto:efei731@sina.com ''''===2004.7 ''''=======================================================
Dim tvwRoot Dim tvwChild Dim tvwPrevious Dim tvwNext
tvwRoot = 0 tvwChild = 1 tvwPrevious = 2 tvwNext = 3
''''===树的类 Class TreeView ?Public Name???''''对象名 ?Public TreeView_Name ? ?Private ArrNodes??''''节点集合,从0开始 ? ?Private ArrImage??''''图标数组 ? ? ? ? ?Private AddFromExpand??''''节点的添加是否来自于父节点的展开 ? ?''''===一些设置 ? ?Public FirstDisplayLevel?''''初次显示几层 ?Public UseConnectLine??''''使用节点之间的连接线 ?''''Public ImagePath???''''图象目录 ?Public Target????''''链接目标 ?Public Font_Size???''''文字大小 ?Public Font_Family???''''字体 ?Public Font_Color???''''颜色 ?Public SelectedBgcolor??''''选中的节点背景色 ? ?''''===图象目录============================= ?Private lImagePath??? ?Public Property Get ImagePath() ??ImagePath = lImagePath ?End Property ?Public Property Let ImagePath(ByVal vNewValue) ??''''更新之前先去掉原来的节点的边框 ??lImagePath = vNewValue ??If Right(lImagePath,1) <> "/" Then lImagePath = lImagePath & "/" ?End Property ?''''======================================== ? ?Private lSelectedNode??''''被选择的节点 ?Public Property Get SelectedNode() ??Set SelectedNode = lSelectedNode ?End Property ?Public Property Let SelectedNode(ByVal vNewValue) ??''''更新之前先去掉原来的节点的边框 ??If Not lSelectedNode Is Nothing Then ???With Document.getElementById("txt" & lSelectedNode.Key).style ????.background = "" ???End With ??End If ??Set lSelectedNode = vNewValue ??With Document.getElementById("txt" & lSelectedNode.Key).style ???.background = SelectedBgcolor ??End With ?End Property ? ?Private lMenuNode ?Private lPopupMenu ? ?''''===类的析构函数,用于初始化对象============== ?Private Sub Class_Initialize() ??''''===初始化树对象 ??Document.Write "" ??''''=== ??Redim ArrNodes(0) ??Set ArrNodes(0) = Nothing ??name="" ??TreeView_Name = "Efei Super TreeView" ?? ??Set lSelectedNode = Nothing ??Set lMenuNode = Nothing ??lPopupMenu = "" ?? ??Redim ArrImage(1,2) ??ArrImage(0,0) = "FolderClose" ??ArrImage(1,0) = "FolderClose.gif" ??ArrImage(0,1) = "FolderOpen" ??ArrImage(1,1) = "FolderOpen.gif" ??ArrImage(0,2) = "Rplus" ??ArrImage(1,2) = "Rplus.gif" ??AddImage "root","root.gif" ??AddImage "file","file.gif" ?? ??lImagePath = "Image/" ??FirstDisplayLevel = 0 ??UseConnectLine = True ??AddFromExpand = False ??Target = "_Blank" ?? ??Font_Size = "12px" ??Font_Family = "宋体" ??Font_Color = "#000000" ??SelectedBgcolor = "#D4D0C8" ?? ?End Sub ?''''=============================================== ? ?''''===功能:?添加一个节点 ?''''===参数:?Text???节点显示的文本 ?''''???Key????节点关键字,该关键字必须唯一 ?''''???HyperLink??节点要链接到的地址 ?''''???Node???父节点或者兄弟节点 ?''''???AddType???添加类型,0-子节点,1-子节点,2-前置节点,3-后置节点 ?''''???Image???节点的图片,如空,则使用关闭的文件夹 ?Public Function add(ByVal Text,ByVal Key,ByVal HyperLink,ByRef Node,ByVal AddType,ByVal Image) ??Dim i ??''''先检查关键字是否已存在,参数是否合法 ??Key = Trim(Key) ??If Key = "" Then ???Msgbox "关键字不能为空",vbInformation,TreeView_Name ???Exit Function ??End If ??If NOT Me.Nodes(Key) Is Nothing Then ???Msgbox "关键字【" & Key & "】已存在",vbInformation,TreeView_Name ???Exit Function ??End If ??Text = Trim(Text) ??If Text = "" Then ???Msgbox "节点文本不能为空",vbInformation,TreeView_Name ???Exit Function ??End If ??If IsNumeric(AddType) = True Then ???If AddType < 0 And AddType > 3 Then ????AddType = 1 ???End If ??Else ???AddType = 1 ??End If ??If Node Is Nothing Then ???If Me.NodesCount <> 0 Then ????Msgbox "根节点只能有一个",vbInformation,TreeView_Name ????Exit Function ???End If ???AddType = 0 ??End IF ??? ??Redim Preserve ArrNodes(Me.NodesCount) ??Set ArrNodes(Ubound(ArrNodes)) = New Node ?? ?? ?? ??With ArrNodes(Ubound(ArrNodes)) ???.Key = Key ???.Text=Text ???.HyperLink=HyperLink ??? ???.AddType = AddType ???.Image = Image ???Set .parentObject = Me ??? ??? ???Select Case AddType ????Case 0??''''根节点 ?????Set .ParentNode=Nothing ?????Set .NextNode = Nothing ????Case 1??''''子节点 ?????Set .ParentNode = Node??????''''父节点 ?????If Node.ChildrenCount > 0 Then ??????Set .PreviousNode = Node.Children(Node.ChildrenCount) ??????Set Node.Children(Node.ChildrenCount).NextNode = ArrNodes(Ubound(ArrNodes)) ?????End If ?????Set .NextNode = Nothing ????Case 2??''''插在前面 ?????Set .ParentNode = Node.ParentNode ?????Set .PreviousNode = Node.PreviousNode ?????Set Node.PreviousNode.NextNode = ArrNodes(Ubound(ArrNodes)) ?????Set Node.PreviousNode = ArrNodes(Ubound(ArrNodes)) ?????Set .NextNode = Node ????? ????Case 3??''''插在后面 ?????Set .ParentNode = Node.ParentNode ?????Set .PreviousNode = Node ?????Set .NextNode = Node.NextNode ?????Set Node.NextNode = ArrNodes(Ubound(ArrNodes)) ???End Select ???If Not .ParentNode Is Nothing Then ????''''更新父节点的内容 ????.Level = .ParentNode.Level + 1 ???? ????.ParentNode.AddChild ArrNodes(Ubound(ArrNodes))??''''添加子节点 ???End If ???''''If Image <> "" Then ???''''?.Image = Me.Images(Image) ???''''End If ??? ???.Display ??? ??? ???If .Level > Me.FirstDisplayLevel Then ????.DisplayStatus = 0 ???Else ????If NOT .ParentNode Is Nothing AND AddFromExpand = False Then ?????If .ParentNode.ExpandStatus = 0 Then ??????.ParentNode.ExpandStatus = 1??''''自己都显示了,那说明父节点肯定是展开的 ?????End If ????End If ????.DisplayStatus = 1 ???? ???End If ??? ??? ??? ??? ???If NOT .ParentNode Is Nothing Then?? ????RefreshImage .ParentNode???? ???End If ???''''================= ??End With ??Set add = ArrNodes(UBound(ArrNodes)) ?End Function ?''''============================================================================================== ? ? ?''''===功能:?移除一个节点,包括该节点下的所有子节点============================================= ?''''===参数:?Key???节点的Key,或者是顺序号 ?Public Function RemoveNode(ByVal Key) ??Dim i ??Dim Node ??Set Node = Nothing ??Key = Trim(Key) ??If Key = "" Then ???Exit Function ??End IF ??If IsNumeric(Key) = True Then ???If Key > 0 And Key <= Me.NodesCount Then ????Set Node = Nodes(Key) ???End If ??Else ???Set Node = Nodes(Key) ??End If ??If Node Is Nothing Then ???Exit Function ??End If ??Do Until Node.ChildrenCount = 0 ???RemoveNode Node.Children(1).Key ??Loop ?? ??If Not Node.PreviousNode Is Nothing Then ???''''如果有前置节点,则要重新设置前置节点的后置节点 ???Set Node.PreviousNode.NextNode = Node.NextNode ??End If ??If Not Node.NextNode Is Nothing Then ???''''如果有后置节点,则要重新设置后置节点的前置节点 ???Set Node.NextNode.previousNode = Node.PreviousNode ??End If ?? ??''''===设置它的父节点的子节点内容================================ ??With Node.ParentNode ??? ???For i = 0 To .ChildrenCount - 1 ????If .ChildrenNodes(i).Key = Key Then ?????Exit For ????End If ???Next ???For i = i To .ChildrenCount - 2 ????Set .ChildrenNodes(i) = .ChildrenNodes(i+1) ???Next ???.ChildrenCount = .ChildrenCount - 1 ???Redim Preserve ChildrenNodes(.ChildrenCount - 1) ??End With ??''''============================================================= ?? ??''''===设置树对象的节点集合====================================== ??For i = 0 To Ubound(ArrNodes) ???If ArrNodes(i).Key = Key Then Exit For ??Next ??For i = i To Ubound(ArrNodes) - 1 ???Set ArrNodes(i) = ArrNodes(i+1) ??Next ??Redim Preserve ArrNodes(Ubound(ArrNodes)-1) ??''''==============================================================?? ?? ??Set Node = Document.getElementByID(Key).parentElement.parentElement ??Node.ParentElement.parentElement.deleteRow Node.rowIndex ?? ?? ?? ??Set Node = Nothing ?End Function ?''''============================================================================================== ? ? ? ?''''===Nodes集合,返回一个节点,如果没有,返回Nothing======== ?Public Function Nodes(index) ??dim i ??Set Nodes = Nothing ??If IsNumeric(index) = True Then ???If Ubound(ArrNodes)+1 >= index And index > 0 Then ????Set Nodes = ArrNodes(index - 1) ???End If ??Else ???If Ubound(ArrNodes) = 0 And ArrNodes(0) Is Nothing Then ???? ???Else ????For i=0 to Ubound(ArrNodes) ?????If ArrNodes(i).Key = index Then ??????Set Nodes = ArrNodes(i) ?????End If ????Next ???End If ??End If ?End Function ?''''========================================================== ? ?Public Property Get NodesCount() ??If Ubound(ArrNodes) = 0 And ArrNodes(0) Is Nothing Then ???NodesCount = 0 ??Else ???NodesCount = Ubound(ArrNodes) + 1 ??End If ?End Property ?Public Property Let NodesCount(ByVal vNewValue) ??Msgbox "NodesCount属性只读!" ?End Property ? ?''''===功能:?清空图标集合===================================== ?Public Function ClearAllImage() ??Redim ArrImage(1,0) ?End Function ?''''===End====================================================== ? ?''''===功能:?添加图标集合===================================== ?''''???如果关键字imgKey存在,则更新,如不存在,则添加 ?''''===参数:?imgKey??图标关键字 ?''''???imgSrc??图标的名称 ?Public Function AddImage(ByVal imgKey,ByVal imgFileName) ??dim i ??For i=1 To Ubound(ArrImage,2) ???If ArrImage(0,i) = imgKey Then ????ArrImage(1,i) = imgFileName??''''更新 ????Exit Function ???End If ??Next ??''''添加 ??If IsNumeric(imgFileName) = True Then ???Msgbox "图标关键字不能为纯数字!请使用字母或字母和数字的组合。" ???Exit Function ??End If ??i = Ubound(ArrImage,2)+1 ??Redim Preserve ArrImage(1,i) ??ArrImage(0,i) = imgKey ??ArrImage(1,i [1] [2] [3] 下一页 [常用软件]TreeView 控件应用详解 [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二) [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(一) [Delphi程序]Delphi中为TreeView添加单选和复选框 [Delphi程序]Object TreeView简要说明 [Delphi程序]Delphi下Treeview控件基于节点编号的访问 [VB.NET程序]将listview中显示出来的记录拖到treeview中去 [VB.NET程序]TreeView 控件树状控件的填充VB以及 VS.NET C#源代… [VB.NET程序]Treeview 控件的使用方法 [Web开发]在ASP.NET中使用Treeview控件和XML
|