❶ C#中treeview的使用方法
TreeView组件是由多个类来定义的,TreeView组件是由命名空间"System.视窗系统.Forms"中的"TreeView"类来定义的,而其中的节点(即Node),是由命名空间"System.视窗系统.Forms"中的"TreeNode"来定义的。所以当在程式中创建一个TreeView对象,其实只是创建了一个能放置节点的"容器"。而在这个容器中加入一个节点,其实就是加入了从"TreeNode"类中创建的一个节点对象;同样删除一个节点,也就是删除一个"TreeNode"节点对象。
一. 本文中介绍的程式设计及运行环境
(1).微软视窗2000 服务器版
(2)..Net Framework SDK 正式版
二. C#操作TreeView组件中的一些常用方法及具体实现:
TreeView组件虽然是个操作起来比较麻烦的组件,但归根到底,能总结为三种基本操作:加入子节点、加入兄弟节点和删除节点。掌控了这三种常用操作,对于在编程中灵活运用TreeView组件是十分必要的。下面就分别来加以介绍。
(1).加入子节点:
所谓子节点,就是处于选定节点的下一级节点。加入子节点的具体过程是:首先要在TreeView组件中定位要加入的子节点的位置,然后创建一个节点对象,然后利用TreeVeiw类中对节点的加入方法(即:Add ( )方法),加入此节点对象。下面就是在treeView1组件中加入一个子节点的具体代码:
//首先判断是否选定组件中的位置
if ( treeView1.SelectedNode == null )
{
MessageBox.Show ( "请选择一个节点" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
}
else
{
//创建一个节点对象,并初始化
TreeNode tmp ;
tmp = new TreeNode ( "节点名称" ) ;
//在TreeView组件中加入子节点
treeView1.SelectedNode.Nodes.Add ( tmp ) ;
treeView1.SelectedNode = tmp ;
treeView1.ExpandAll ( ) ;
}
(2).加入兄弟节点:
所谓兄弟节点,就是在选定的节点的平级的节点。加入兄弟节点的方法和加入子节点的方法基本一致,只是在最后的实现方法上有着略微的差别。加入兄弟节点的具体步骤,首先也是要确定要加入的兄弟节点所处的位置,接着定义一个节点对象,最后调用TreeView类中对兄弟节点加入的方法,加入此节点对象。加入兄弟节点和加入子节点的最大差别就在于这最后一步。希望读者能够注意。下面是在TreeView组件加入一个兄弟节点的具体代码:
//首先判断是否选定组件中节点的位置
if ( treeView1.SelectedNode == null )
{
MessageBox.Show ( "请选择一个节点" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
}
else
{
//创建一个节点对象,并初始化
TreeNode tmp ;
tmp = new TreeNode ( textBox1.Text ) ;
//在TreeView组件中加入兄弟节点
treeView1.SelectedNode.Parent.Nodes.Add ( tmp ) ;
treeView1.ExpandAll ( ) ;
}
(3).删除节点:
删除节点就是删除TreeView组件中选定的节点,删除节点能是子节点,也能是兄弟节点,但无论节点的性质怎么,必须确保要删除的节点没有下一级节点,否则必须先删除此节点中的所有下一级节点,然后再删除此节点。删除节点比起上面的二个操作要显得略微简单,具体方法是:首先判断要删除的节点是否存在下一级节点,如果不存在,就调用TreeView类中的Remove ( )方法,就能删除节点了。下面是删除TreeView组件中节点的具体代码:
//判断选定的节点是否存在下一级节点
if ( treeView1.SelectedNode.Nodes.Count == 0 )
//删除节点
treeView1.SelectedNode.Remove ( ) ;
else
MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
(4).TreeView组件的一些其他常用操作:
其他的一些常用操作比起上面的三种操作,在具体实现上要显得简单许多。这些常用操作无非是,展开所有节点,展开指定的节点、和折叠所有节点。下面就来具体介绍一下:
< I > .展开所有节点:
要展开TreeView组件中的所有节点,首先就要把选定的节点指针定位在TreeView组件的根节点上,然后调用选定组件的ExpandAll方法就能了,下面是具体代码:
//定位根节点
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//展开组件中的所有节点
treeView1.SelectedNode.ExpandAll ( ) ;
< II > .展开选定节点的下一级节点:
由于只是展开下一级节点,所以就没有必要用ExpandAll ( )方法了。展开下一级节点只需要调用Expand ( )方法就能了,下面是具体的实现代码:
treeView1.SelectedNode.Expand ( ) ;
< III > .折叠所有节点:
折叠所有节点和展开所有节点是一组互操作,具体实现的思路也大致相同,折叠所有节点也是首先要把选定的节点指针定位在根节点上,然后调用选定组件的Collapse ( )就能了,下面是具体的实现代码:
//定位根节点
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//折叠组件中所有节点
treeView1.SelectedNode.Collapse ( ) ;
至此已把在C#操作TreeView组件的常用方法和一般方法基本都介绍
北航嵌入式培训
❷ C#中treeview的使用方法
你要导出的文件是一个集合还是什么?
关于treeview的话,你需要先定义一个treeview对象,然后给它的一级标签循环指定值,然后在它的循环里面在循环将子标签的值也给指定。然后将treeview对象与循环的值绑定就可以了。
❸ 怎样使用C#TreeView控件
方法/步骤
1
打开Microsoft Visual Studio 2010, 新建名字为【treeView】的程序。
2
在界面上添加【treeView】的控件,并调整为合适大小。
3
在程序界面上加入其它需要的控件:包括,
用于输入父节点个数和子节点个数的2个输入框;
生成节点的按钮、删除节点的按钮、清除所有节点的按钮;
输出日志信息的文本框。
4
编辑代码,输入【生成节点】的代码;
获取子节点和父节点的个数,使用循环添加父节点和子节点。
5
编辑【清除所有节点】的代码。
6
编辑【删除所选节点】的代码。
7
点击【treeview】控件,在属性中选择行为,从行为列表中选择【afterselect】双击,在代码编辑页面,添加节点被选择后的代码。
8
编辑输出日志的output方法的代码。
9
生成exe文件进行测试
10
输入父节点和子节点数量分别为2和4,生成树结构。确认生成成功。
11
点击【清除所有节点】,可以看到所有节点都已经被清空。
12
输入父节点和子节点数量分别为3和3,生成树结构。确认生成成功。
13
点击【父节点3】的【子节点2】,点击【删除节点】。
14
可以看到该子节点已经被清空。再点击【父节点2】。
15
点击【删除节点】,可以看到该父节点已经被清空。
16
点击各个节点时,可以看到日志中输入对应的节点信息。
http://jingyan..com/article/335530daaf806019cb41c39f.html
❹ vb中treeview的使用方法
首先在 VB 中建立一个新工程,单击“工程/部件” ,在控件列表中选中“ Microsoft Windows command controls6.0(sp4)”,按下“确定”按钮返回主界面,在左侧控件 窗体中选中 Treeview 控件置于窗体上,再放置一个 Imagelist 控件、两个 Label 控件、两 个 Textbox 控件、六个 commandbutton 控件,其属性分别如下: Treeview 控件:名称 Treeview1; Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32) ,建立索 引 1、2、3; (方法:在 Imagelist 控件上单击鼠标右键选择属性) Label 控件:名称分别为 Lab(0) 、Lab(1) ,Caption 分别为“父节点:、 ”“子节点:; ” Textbox 控件:名称分别为 Txt(0) 、Txt(1) ,text 都为“” ; commandbutton 控件:名称为系统默认,Caption 分别为“添加”“展开”“收起”“排 、 、 、 序”“删除”“退出” 、 、 ; 将下列代码加入到代码框: Option Explicit Dim I As Integer Dim J As Integer Dim nodx As Node Dim CunZai As Boolean '定义变量 Private Sub Command1_Click() If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允许建立零字节的父节点和子节点 CunZai = False J = TreeView1.Nodes.Count For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在 If TreeView1.SelectedItem.Children > 0 Then If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True End If Next I If CunZai = True Then '若存在, 则在父节点下建立子节点 Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J, Txt(1).Text, 3) Else ,若不存在,则建立父节点和子节点 Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1) Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_ Txt(1).Text, 3) End If TreeView1.Refresh ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!" '系统提示 ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!" End If End Sub Private Sub Command2_Click() For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = True '展开所有节点 Next I End Sub Private Sub Command3_Click() For I = 1 To TreeView1.Nodes.Count TreeView1.Nodes(I).Expanded = False '收起所有节点 Next I End Sub Private Sub Command4_Click() TreeView1.Sorted = True '排列顺序 End Sub Private Sub Command5_Click() If TreeView1.SelectedItem.Index <> 1 Then TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点 End If End Sub Private Sub Command6_Click() End '退出程序 End Sub Private Sub Form_Load() TreeView1.LineStyle =TvwTreeLines '在兄弟节点和父节点之间显示线 TreeView1.ImageList = ImageList1 '链接图像列 TreeView1.Style = '树状外观包含全部元素 Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1) '建立名称为"蒲子明"的父节点,选择索引为 1 的图像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3) '在"蒲子明"父节点下建立"收件箱"子节点,选择索引为 3 的图像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "发件箱", 3) '在"蒲子明"父节点下建立"发件箱"子节点,选择索引为 3 的图像 CunZai = False End Sub Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Node.ExpandedImage = 2 '节点被展开时,选择索引为 2 的图像 End Sub Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0 为无 For I = 1 To TreeView1.Nodes.Count If TreeView1.Nodes(I).Selected Then MsgBox "您选择的是:“" & TreeView1.Nodes(I).FullPath & "”子节点!" '系统提示 End If Next I End If
End Sub
❺ 怎样使用TREEVIEW控件
在进行VFP程序开发时,为了让我们的应用程序看起来更加专业化,我们不可避免地要在设计过程中为程序添加一些专业的控件。工欲善其事必先利其器,在进行程序设计时对所用的控件必须有一个清晰的了解。本文要向大家介绍的就是TreeView控件。TreeView控件能够以一种树形目录的方式来显示各种资料,常见的TreeView控件使用的例子就是注册表编辑器和Windows的资源管理器,单击节点的+号,你可以展开该节点,同样你也可以关闭所展开的节点。如何在你的程序中加入TreeView控件?接下来以VFP为例,向大家介绍TreeView控件的使用方法。一、在表单中添加TreeView控件TreeView控件属于OLE控件。所以,在VFP中添加TreeView控件的方法是在表单中加入OLE容器控件,在出现了InsertObject标题之后,选择InsertControl,在ObjectType栏内选择MicrosoftTreeViewControl。之后,在表单上你就能看到TreeView控件了。二、在TreeView控件中加入节点往TreeView控件中加入节点是一项很关键的工作。使用TreeView控件中Node(节点)对象的Add方法,你便能够定制由TreeView控件显示的内容(节点内容)。Add的用法如下:Add(relative,relationship,key,text,image,selectedimage)各个参数的含义如下:Relative:参照节点的键值。往TreeView控件加入节点时,你能够决定所添加的节点与业已存在的节点之间的关系。relative参数的作用就是指明已存在的节点的名称(键值)。Relationship:指明欲加入的节点与业已存在的节点之间的关系。其可选值及具体含义如下:0:顶级节点,新添的节点放置在参照节点的最上面。1:末级节点,新添的节点放置在参照节点的最下面。2:次级节点,新添的节点紧跟参照节点。3:上级节点,新添的节点放在参照节点的上面。4:子节点,新添的节点为参照节点的子节点。需要说明的是,描述上述参数使用到的顶、末、次、上具体是指物理位置上的关系。并且,新添加的节点的存放位置与申明语句的先后位置无关。Key:新添加节点的键值(字符串类型),该键值必须是唯一的。Text:所添加节点的标题。Image和selectedimage:图像索引值。可选参数(N型),指明新添加的节点在选中与没选中时所显示的不同图像。通常,这些图像是存放在ImageList(用来存放图片的)控件中的。在TreeView控件中你可以设置该控件的ImageList值。三、对TreeView控件的常用操作 1.添加节点:添加节点的操作主要是由上面提到的Add函数完成的。由TreeView控件中每个被显示的目录项被称之为节点(Node),应该注意的是:在添加过程中,你操作的对象是节点,而非TreeView控件本身。所以你不能直接使用TreeView.add命令。2.删除节点:删除节点主要是使用Remove函数,该函数的用法如下:Nodes.Remove(Key),Key指明欲删除节点的键值。3.指明对TreeView控件事件响应程序:在设计好TreeView之后,指明对事件如何响应是必不可少的。通常,最常用的是针对Click、DblClick和NodeClick事件,在设计此类事件的响应程序时,很自然地要涉及到确认用户所选择的节点。上面提到了,在对TreeView进行操作时,实际上是在对Node对象进行操作。Node对象中实际上是与之有关的各种数据(如:节点的Key值、Text值、Image值等等)和函数的结合体。通过对Node对象进行存取操作,一切都变得那么容易了。四、实战演习上面说了那么多,还是亲自动动手吧。下面的例子可以让你对TreeView控件有更加清晰地认识。这些程序并不复杂,但却演示了TreeView控件的基本原理及常用的操作。1.在TreeView控件的Init事件中添加如下代码,这些语句能够让你了解TreeView控件中节点与节点之间的关系:this.nodes.add(,,TOP,参照目录项)this.nodes.add(TOP,0,TopOnTop,参数0:放在参照目录项的最上面)this.nodes.add(TOP,1,TOP1,参数1:放在参照目录项的最下面)this.nodes.add(TOP,2,TOP2,参数2:紧靠参照目录)this.nodes.add(TOP,3,TOP3,参数3:放在参照目录的上面)this.nodes.add(TOP,4,Child?of?TOP,参数4:参照目录的子目录)this.nodes.add(Child?of?TOP,4,GrandSon?of?
❻ 十八、Treeview
Treeview是tkinter.ttk的控件,这个控件主要是提供多栏的显示功能,我们可以称其为
树状表格数据(Treeview)。在设计时也可以在左边栏设计成树状结构或是称层次结构,用户
可以显示或隐藏任何部分,这个最左边的栏称为图标栏。
设计Treeview控件的基本思想是,使用Treeview构造方法建立Treeview对象。
它的语法如下。
Treeview(父对象,options,···)
Treeview()方法的第一个参数是父对象,表示这个Treeview将建立在哪一个父对象内。
下列是Treeview()方法内其他常用的options参数。
(1)columns:栏位的字符串,其中,第一个栏位是图标栏默认的,不在此设置范围内,
如果设置columns=("Name","Age"),则控件有三栏,首先是最左栏的图标栏,可以进行展开
(expand)或是隐藏(collapse)操作,另外两栏是Name和Age。
(2)cursor:可以设置光标在此控件上的外观。
(3)displaycolumns:可以设置栏位显示顺序。
1.如果参数是"#all"表示显示所有栏,同时依建立顺序显示。
2.如果设置columns=("Name","Age","Date"),使用insert()插入元素时需要依次插入元素。
同样状况如果使用columns(2,0),(2,0)是指实体索引,则图标栏在最前面,紧跟着是Date栏,
然后是Name栏。这种状况也可以写成columns("Date","Name")
(4)height:控件每行的高度。
(5)padding:可以使用1~4个参数设置内容与控件框的间距。
(6)selectmode:用户可以使用鼠标选择项目的方式。
1.selectmode=BROWSE,一次选择一项,这是默认。
2.selectmode=EXTENDED,一次可以选择多项。
3.selectmode=NONE,无法用鼠标执行选择。
(7)show:默认是设置显示图标栏的标签show="tree",如果省略则是显示图标栏,如果设为
show="headings",则不显示图标栏。
(8)takefocus:默认是True,如果不想被访问可以设为False。
实例:简单建立Treeview控件的应用。
运行结果:
讲解:tree=Treeview(root,columns=("cities"))建立Treeview控件,此控件
有一个栏位,域名是cities。
tree.heading("#0",text="State")和tree.heading("#1",text="City")使用heading()方法,
在这个方法内建立了栏标题,其中,第一个参数"#0"是指最左栏图标栏位,"#1"是指第一个
栏位,所以这两行分别建立了两个栏标题。
tree.insert("",index=END,text="伊利诺",value="芝加哥")使用inert()方法插入Treeview控件
内容,在这个方法中的第一个参数"",代表父id,因为图标栏未来可以有树状结构,所以有这
一个栏位设计。当所建的栏是是最顶层时,可以用""空字符串处理。第二个参数index=END代表
将资料插入Treeview末端,它的思想与Text控件的END相同。第三个参数text是设置图标栏的
内容。第4个参数的values是设置City的内容。
样例2:在建立Treeview控件时,增加show="heading"参数,将不显示图标栏。
运行结果:
insert()方法第4个参数values是设置所插入的内容。如果有多栏时,须使用
values=(value1,value2,···),如果所设置的内容数太少时其他栏僵尸空白,如果所设置
的内容数太多时多出来的内容将被抛弃。
样例3:增加population人口数栏位,其中,人口数的单位是万人。
运行结果:
也可以将Python的列表应用于建立栏位内容。
Treeview控件的column()方法主要用于格式化特定栏位的内容,它的语法格式如下。
column(id,options)
其中,id是指出特定栏位,可以用字符串表达,或是用"#index"索引方式。下列是options
的可能参数。
(1)anchor:可以设置栏内容参考位置。
(2)minwidth:最小栏宽,默认是20像素。
(3)stretch:默认是1,当控件大小改变时栏宽将随着改变。
(4)width:默认栏宽是200像素。
如果使用此方法不含参数,如下所示:
ret=column(id)
将以字典方式传回特定栏所有参数的内容。
样例:格式化,将第1、2栏宽度改为150,同时居中对齐,图标栏则不改变。
建立Treeview控件内容时,常常会需要在不同行之间用不同底色作区分,以方便使用者查看,
若是想设计这方面的程序,可以使用Tet控件的标签。Treeview控件有tag_configure()方法,
可以使用这个方法建立标签,然后定义此标签的格式,可参考下列指令。
tag_configure("tagName",options,···)
上述第一个参数tagName是标签名称,可以用此名称将此标签导入栏位数据。
options的可能参数如下。
(1)background:标签背景颜色。
(2)font:字形设置。
(3)foreground:标签前景颜色。
(4)image:图像与列表同时显示。
要将标签导入栏位使用的是insert()方法,这时需在此方法内增加tags参数设置,如下所示。
insert(···,tags="tagName")
样例:将偶数行使用蓝色底显示。
层级式(Hierarchy),只要在图标栏先建立top-level的项目id,然后将相关子项目放在所属的
top-level项目d即可。
样例:建立层级式的Treeview控件内容。
在insert()方法内若是增加image参数可以添加图像,在添加图像时需要考虑的是可能row的
高度不足,所以必须增加高度。这时可以用下列Style()方法处理。
Style().conigure("TreeView","rowheight=xx") #xx是高度设置
样例:设计一个含有图像的Treeview。
Treeview控件中可以有三种选择模式,分别是BROWSE(默认)、EXTENDED、NONE,这是
使用selectmode参数设置的,当有新选择项目发生时会产生虚拟事件<<TreeviewSelect>>,
其实我们可以针对此特性设计相关功能。
样例:
在Treeview控件中可以使用delete()方法删除所选的项目,实例:
样例:删除所选的项目,这个程序在建立Treeview控件时设置selectmode=EXTENDED,相当于一次
可以选择多项,第二个选项在单击鼠标时可以同时按Ctrl键,可以选择不连续的选项。如果
第二个选项在单击鼠标时同时按Shift键,可以选择连续的选项。这个程序下方有Remove按钮,
单击此按钮可以删除所选项目。
在使用Treeview控件时,另一个常用功能是插入项目。插入的方式与建立控件的插入方法insert()
是一样的。至于所插入的内容则可以使用tkinter的Entry控件。
样例:增加设计插入功能,由于这个Treeview控件包含图标栏下共有两个栏位,所以若是想要
插入必须建立两个Entry控件。由于我们必须标出所插入的控件,所以必须在Entry旁加上两个
标签。另外,在执行插入时必须使用一个按钮表示出执行插入操作,所以必须另外创建一个按钮。
讲解:rowconfigure()方法的第一个参数是1,代表row=1,相当于让row=1的Treeview
控件随着窗口缩放,缩放比由第二个参数weight=1得知是1:1缩放。columnconfigure()方法
的第一个参数是1,代表column=1,相当于让column=1的stateEntry控件随着窗口缩放,缩放
比由第二个参数weight=1得知是1:1缩放。columnconfigure()方法内的第一个参数是3,代表
column=3,相当于让column=3的cityEntry控件随着窗口缩放,缩放比由第二个参数weight=1
得知是1:1缩放。如果没有上述设置,当缩放窗口时,所有组件大小将不会更改。
在使用Treeview控件时,常常需要执行双击操作,最常见的是打开文档。在Treeview控件中
当发生双击时,会产生<Double-1>事件,我们可以利用这个功能建立一个双击的事件处理程序。
样例:当双击Treeview控件中的某个项目时,会出现对话框,列出所选的项目。
讲解:identify("xxx",event.x,event.y)
第一个参数xxx可以是item、column、row,分别使用双击时的坐标,取得双击时的
item、column或row的信息,此例是使用item,所以我们可以由此获得是哪一个项目被
双击。
在创建Treeview控件后,由一个很常见的功能是将栏目信息做排序,通常可以单击栏位标题就
可以执行排序。
样例:排序Treeview控件State栏的数据,在这个程序中为了简化程序,省略了图标栏。
所以Treeview控件只有一个State栏,当单击栏标题时可以正常排序,如果再单击时可以
反向排序,排序方式将如此切换。
讲解:heading()方法,当用鼠标单击标题栏时会执行command所指定的方法,这是
Lambda表达式,将"states"设置给变量c,然后将c当作参数传递给treeview_sortColumn()方法。
get_children([item])
它会传回item的一个tuple的iid值,如果省略则是得到一个tuple,此tuple是top-level的iid值。
move()方法:
move(iid,parent,index)
将iid所指项目移至parent层次的index位置,此程序用""代表parent层次
❼ vb.net中TreeView控件的使用
在中 TreeView(树型结构)控件是显示节点(Node)对象的级层结构 它通常用于显示一些有等级结构的信息 我们最为熟悉的就是Windows资源管理器左边显示文件和文件夹的窗口 在工具箱中 TreeView 控件的图标如下图一所示
TreeView控件的每个节点(Node对象)包含了一个标签和可选的点位图 每个节点又可能包含有若干个的子节点 可以通过控制某个节点来展开显示或者折叠隐藏它所包含的子节点
一 TreeView 控件的一些常用属性
CheckBoxes 属性 指示是否在树视图控件中的树节点旁显示复选框
FullRowSelect 属性 当 FullRowSelect 为 true 时 选择突出显示将跨越树视图的整个宽度 即整个显示区域的宽度而不仅仅是树节点标签的宽度 如果 ShowLines 设置为 true 则将忽略 FullRowSelect 属性
HideSelection 属性 指示选定的树节点是否即使在树视图已失去焦点时仍会保持突出显示
HotTracking 属性 如果 HotTracking 属性设置为 true 那么当鼠标指针移过每个树节点标签时 树节点标签都将具有超级链接的外观 Underline 字体样式将应用于 Font 而 ForeColor 将设置为蓝色 从而使标签显示为链接 注意 如果 CheckBoxes 属性设置为 true HotTracking 属性将失效
Indent 属性 设置每个子树节点级别的缩进距离(以像素为单位)
ItemHeight 属性 设置树视图控件中每个树节点的高度
Nodes 属性 获取分配给树视图控件的树节点集合 这个属性是TreeView 控件最重要的属性之一 我们下文将会对它进行更加的详细的说明
PathSeparator 属性 树节点路径(TreeNode FullPath 属性)所使用的分隔符串 默认为反斜杠字符 () 树节点路径包括一组由 PathSeparator 分隔符串分隔的树节点标签 标签的范围为根树节点到所需的树节点 如下代码我们可以获得当前选中的节点的路径
MessageBox Show(TreeView SelectedNode FullPath)
SelectedNode 属性 获取或设置当前在树视图控件中选定的树节点 如果没有选定任何节点 则 SelectedNode 属性则为Nothing
ShowLines 属性 指示是否在树视图控件中的树节点之间绘制连线
ShowPlusMinus 属性 指示是否在包含子树节点的树节点旁显示加号 (+) 和减号 ( ) 按钮
ShowRootLines 属性 指示是否在树视图根处的树节点之间绘制连线
如下图二所示 为ShowLines 属性 ShowPlusMinus 属性 ShowRootLines 属性都设置为True的情形
二 为TreeView 控件添加节点
TreeView 控件的 Nodes 属性包含了它所有的节点 下面我们就来了解如何为树状控件添加节点
通过树节点编辑器添加
选中TreeView 控件 在它的属性对话框中找到Nodes 属性 然后单击它后面的省略号 弹出 树节点编辑器 如下图三所示
然后通过编辑器上的 添加根 来添加根节点 通过 添加子级 来为选中的节点添加子节点 通过 删除 来删除选定的节点 标签 输入框确定节点的名称 注意 只有设置了TreeView 控件的ImageList 属性才能选择设置节点的图像
通过编程方式添加节点
给TreeView添加结点用到的是 Nodes Add 方法 首先选定要添加子结点的结点才能应用这个方法
TreeView中的结点的组织关系是父结点管理子结点的关系 也就是说 子结点组成的集合就是父结点的 Nodes 属性 子结点的 Index 属性 是根据其在子结点集合中的位置而决定的 而不是整棵树中结点的位置 根据这个特点 若想找到指定结点须按以下的语法
TreeViewName Nodes Item(Index ) Nodes
而添加结点的方法为
TreeViewName Nodes Item(Index ) Nodes Add( NodeText )或
TreeViewName Nodes Item(Index ) Nodes Add( objNode )
如下代码所示为选中的节点添加一个子节点
TreeView SelectedNode Nodes Add( )
编程删除节点
使用Nodes属性的Remove 方法删除单个节点 也可以使用Clear 方法清除所有的节点 如下代码所示
删除选定的节点
TreeView Nodes Remove(TreeView SelectedNode)
清除TreeView 控件的所有节点
TreeView Nodes Clear()
示例演示
我们现在用一个实例来看如何使用Nodes属性来实现代码编程添加删除树形控件的节点 首先为设计如下图四所示的程序界面 其中有四个Button 控件 一个TreeView 控件
为 添加根节点 按钮添加如下代码
TreeView Nodes Add( 根节点 & (TreeView GetNodeCount(False) + ))
注意 GetNodeCount方法为获得本级别的节点数 可以通过参数False来指定不包括它的子节点
为 添加子节点 按钮添加如下代码
Dim node As TreeNode = TreeView SelectedNode
If Not node Is Nothing Then
node Nodes Add( 子节点 & (node GetNodeCount(False) + ))
Else
MessageBox Show( 没有选中任何节点 )
End If
注意 TreeNode GetNodeCount 方法返回的是分配给 Nodes 集合的子树节点的数目
为 删除单个节点 按钮添加代码
Dim node As TreeNode = TreeView SelectedNode
If node Is Nothing Then
MessageBox Show( 没有选中任何节点 )
Else
TreeView Nodes Remove(node)
End If
为 删除所有节点 按钮添加代码
TreeView Nodes Clear()
代码添加完毕后 运行程序 分别使用 添加根节点 添加子节点 为控件添加节点 如下图五所示
然后再试验删除节点的效果
三 访问控件的所有节点
因为Nodes集合中所包含的只是本级节点的集合 如果某个Node包含有子节点 并不会从当前的Nodes体现出来 如下代码所示 我们只能访问到所有的根节点而不是所有的节点
假定我们是在前面示例的基础上添加一个名为 遍历节点 的按钮 然后在该按钮的Click事件中添加如下代码
Dim node As TreeNode
Dim str As String =
For Each node In TreeView Nodes
str = str & node Text & vbCr
Next
MessageBox Show(str)
node = Nothing
运行后 先分别为控件添加若干个根节点与子节点 然后单击 遍历节点 按钮 效果如下图六所示
很明显 我们遍历了Nodes集合 但是并没有如期访问到子节点 怎么解决这个问题呢?请看下一页
如上页的问题 我们假设一个根节点的Nodes集合为Nodes 该集合中的一个Node节点为Node Node 下有若干个子节点 我们把它的子节点的集合称为Nodes 我们用For Each 遍历Nodes 时 它访问到Node 但不会访问Nodes 集合
如果我们要访问Nodes 就需要像遍历Nodes 一样遍历Nodes 解决办法如下
首先 建立一个过程用于遍历一个Node节点下的子节点
Private Sub PrintNode(ByVal N As TreeNode)
Debug WriteLine(N Text)
Dim node As TreeNode
For Each node In N Nodes
PrintNode(node)
Next
End Sub
然后把 遍历节点 的Click事件中修改为如下代码
Dim node As TreeNode
For Each node In TreeView Nodes
PrintNode(node)
Next
node = Nothing
运行后 先分别为控件添加若干个根节点与子节点 然后单击 遍历节点 按钮 然后查看 输出 窗口 效果如下图七所示
可以发现已经能真正地遍历了所有节点
lishixin/Article/program/net/201311/11617
❽ delphi中treeview的用法
例一
//刷新Tree 1
procere TMainForm.RefTree();
var
Tags:string ;
RootNode0,RootNode1,RootNode2,RootNode3,RootNode4,RootNode5:TtreeNode;
i:integer;
begin
TreeView1.Items.Clear;
RootNode0:=TreeView1.Items.Add(nil,'全部');
RootNode1:=TreeView1.Items.Add(nil,'资分类');
RootNode2:=TreeView1.Items.Add(nil,'部门');
RootNode3:=TreeView1.Items.Add(nil,'情况');
RootNode4:=TreeView1.Items.Add(nil,'位置');
RootNode5:=TreeView1.Items.Add(nil,'方式');
TreeView1.Items[0].ImageIndex:=11;
TreeView1.Items[1].ImageIndex:=54;
TreeView1.Items[2].ImageIndex:=54;
TreeView1.Items[3].ImageIndex:=54;
TreeView1.Items[4].ImageIndex:=54;
TreeView1.Items[5].ImageIndex:=54;
RootNode0.SelectedIndex:=RootNode0.ImageIndex;
RootNode1.SelectedIndex:=RootNode1.ImageIndex;
RootNode2.SelectedIndex:=RootNode2.ImageIndex;
RootNode3.SelectedIndex:=RootNode3.ImageIndex;
RootNode4.SelectedIndex:=RootNode4.ImageIndex;
RootNode5.SelectedIndex:=RootNode5.ImageIndex;
//分类
with DataM.q1 do
begin
SQL.Clear;
SQL.Add('Select Name1 from Navtree where tag=''分类'' ');
Open;
while not eof do
begin
TreeView1.Items.AddChild(RootNode1,FieldValues['Name1']);
next;
end;
end;
(此处省略365个字.....呵呵)
end;
例二
procere TForm1.showtree; //showtree自定义的
var
mynode:ttreenode;
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from aa where value = ''1''');
open;
if recordcount <> 0 then
begin
treeview1.Items.Add(treeview1.TopItem,fieldbyname('name').AsString);
end;
end;
with adoquery2 do
begin
close;
sql.Clear;
sql.Add('select * from aa where len(name) = 4');
open;
while not eof do
begin
mynode:= treeview1.Items.AddChild(treeview1.TopItem,fieldbyname('name').AsString);
with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select * from aa where name like '''+ '%'+ mynode.Text+ ''' and len(name) = 6');
open;
if recordcount <> 0 then
begin
first;
begin
treeview1.Items.AddChild(mynode,fieldbyname('name').AsString);
next;
end;
end;
end;
next;
end;
end;
end
例三
一、指标树的建立
具体方法是:创建一个数据库,设计指标表t_pub_index,包含index_id、parent_id、index_name字段,其它字段根据实际业务而定,指标名称index_name将在树型控件的节点上显示,index_id字段保存节点的唯一标识号,parent_id表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一窗体Frm_sys_index,其上放置TreeView控件tv_zb、Query控件Query1及其它指标属性编辑显示控件。一个树的节点又包含文本(Text)和数据(Data)。Text为String类,用来显示指标或指标目录名称。Data则为无定形指针(Untyped Pointer),可以指向一个与节点相联系的数据结构,该结构与数据库指标表相应域关联,如指标ID、上级节点ID。
Query控件的表达式为:
select index_id, parent_id, index_name from t_pub_index
start with index_id=0 connect by prior index_id=parent_id
其中start with 和connect by 是Oracle的SQL语句的保留字,使一条记录的parent_id列的值等于前一记录的index_id列的值,并以parent_id等于0的记录开始。
建树的基本思路是:
procere TFrm_sys_index.createtree;
var
curValue: indexPointer; //指向与节点相联系的数据结构的指针
curNode : TTreeNode; //当前节点
curid : integer; //当前节点标识号
begin
curNode := nil;
curid := -1;
Query_index.Open;
Query_index.first;
while not Query_index.Eof do
begin
new(curValue);
With curValue^ do
将数据库指标表t_pub_index各字段值赋curValue 所指数据结构
while(curid <> curValue.parent_id) do //当前节点的标识号不等于当前记录的父节点号
begin
curNode := curNode.parent;
curid:= indexPointer(curNode.data).index_id;
end;
curNode := tv_zb.Items.AddChildObject(curNode,
curValue^.index_name,curValue); //在当前节点上添加子节点,显示节点指标名称,所带指针指向一个与指标数据相联系的数据结构
curid := indexPointer(curNode.data).index_id;
Query_index.next;
end;
Query_index.close;
end;
二、增加、删除、修改树节点
单纯在Treeview 上增加、删除、修改节点只需用它本身提供的Treeview.Items. AddChildObject、 Treeview.Selected.Delete、Treeview.Selected.EditText等方法即可,但要相应修改数据库中的数据,必须通过递归调用同一个函数(用于删除一个选项)来遍历所选节点下的所有子节点。下面以删除节点为例介绍具体实现流程:
function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;
var
childnode:TTreenode;
begin
childnode:=node1.GetLastChild; //按倒序获得子项,因为删除选项时,列表会发生变化
while childnode<>nil do
childnode:=delnode(childnode); //如子项不为空,进行递归调用
index_id:=inttostr(indexpointer(node1.data).index_id);//获得该节点对应指标
在数据库删除相应指标;
result:=node1.parent.GetPrevChild(node1); //定位到该节点的上一节点
node1.delete; //删除树节点
end;
三、拖动树节点
拖动树节点基本上是通过建立目标项的新子项、向它复制源项、删除原项来移动选项。与上述删除操作相似,也是通过递归调用同一个函数(用于移动一个选项),按倒序移动所选节点下的所有子节点。下面是递归过程的代码:
procere TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;
sourcenode,targetnode:ttreenode);
var
newnode:ttreenode;
i:integer;
begin
newnode:=treeview.items.addchildfirst(targetnode,''); //建立目标项
newnode.assign(sourcenode); //复制源项属性
for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项
CopyNodeUnder (treeview,sourcenode.item[i],newnode);
treeview.items.delete(sourcenode); //删除源项
end;
Treeview对拖动操作提供支持,我们将组件的DragKind属性设置为dkDrag,DragMode属性设置为dmAutomatic,并为OnDragOver与OnDragDrop事件编写了处理程序。OnDragOver事件处理程序对允许移动的条件进行判断,排除需要避免的特殊情况。代码如下:
procere TFrm_sys_index.tv_zbDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
targetnode,sourcenode:TTreenode;
begin
targetnode:=tv_zb.getnodeat(x,y);
if (Source=Sender) and (targetnode<>nil) then //保证移动在TreeView上,且目标节点不为空
begin
Accept:=true;
sourcenode:=tv_zb.selected;
//以下代码防止用户将一个选项拖到其子项上(它会随着选项一起移动,导致死循环)
while (targetnode.parent<>nil) and (targetnode <> sourcenode) do
targetnode:=targetnode.parent;
if (targetnode = sourcenode) then Accept:=false;
end
else Accept:=false;
end;
OnDragDrop事件处理程序启动前述移动过程CopyNodeUnder,修改数据库数据。此外,在大批量添加数据到Treeview中时最好使用TreeView.Items.BeginUpdate和 TreeView.Items.EndUpdate,这样能加快显示速度。大致流程如下:
procere TFrm_sys_index.tv_zbDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
targetnode,sourcenode:TTreenode;
begin
targetnode:=tv_zb.getnodeat(x,y); //获得源节点
sourcenode:=tv_zb.selected; //获得目标节点
修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;
tv_zb.items.beginupdate; //禁用TreeView重绘操作
try
nodeunder(tv_zb,sourcenode,targetnode); //启动移动过程
tv_zb.selected:=targetnode;
finally
tv_zb.items.enpdate; //重新设置
end;
end;
例四
给你一段超级短的代码,caption字段就是你的value字段,因value是保留字,所以我改成这个了。
procere TForm1.Button1Click(Sender: TObject);
var
ss: TStrings;
begin
AdoQuery1.SQL.Text := 'SELECT name,caption FROM test8 ORDER BY name';
AdoQuery1.Open;
ss := TStringList.Create;
while not AdoQuery1.Eof do
begin
ss.Add(StringOfChar(#9,(Length(Trim(AdoQuery1.FieldValues['name'])) div 2)-1)
+ AdoQuery1.FieldValues['caption']);
AdoQuery1.Next;
end;
ShowMessage(ss.Text);
ss.SaveToFile('d:\test8.txt');
ss.Free;
TreeView1.LoadFromFile('d:\test8.txt');
end;