高效的TreeView构建方法<o:p></o:p>
<o:p></o:p>
网上一直有朋友说.net上的TreeView不够快,而且也不方便。那么真实的情况是否如此呢。我做的一项目中需要一个快速的Tree,它的数据源是MS SQL,其对应表中记录的结构如下:<o:p></o:p>
ID | FatherID | Title |
0101 | 01 | 基本建设支出 |
010109 | 0101 | 其它基本建设支出 |
其特点是父节点的ID正好是当前记录ID的长度-2所截取的字符串<o:p></o:p>
因此我写下了如下代码:<o:p></o:p>
一、普通的方法<o:p></o:p>
Private Function BuildENTree(ByVal ds As DataSet)<o:p></o:p>
Dim rs As DataRowCollection<o:p></o:p>
Dim r As DataRow<o:p></o:p>
Dim ID As String<o:p></o:p>
Dim FatherID As String<o:p></o:p>
Dim Title As String<o:p></o:p>
Dim fn As TreeNode<o:p></o:p>
Dim node As TreeNode<o:p></o:p>
<o:p></o:p>
rs = ds.Tables(0).Rows<o:p></o:p>
BootNode = New TreeNode<o:p></o:p>
BootNode.Text = "[0] 所有单位"<o:p></o:p>
BootNode.Tag = "0" '根目录<o:p></o:p>
treeEN.Nodes.Add(BootNode)<o:p></o:p>
<o:p></o:p>
For Each r In rs<o:p></o:p>
ID = DirectCast(r.Item(0), String).Trim 'CODE<o:p></o:p>
FatherID = DirectCast(r.Item(1), String).Trim 'FATHERCODE<o:p></o:p>
Title = "[" & ID & "] " & DirectCast(r.Item(2), String).Trim 'TITLE<o:p></o:p>
'查找与父节点ID相同的节点<o:p></o:p>
fn = FindNode(FatherID)<o:p></o:p>
If fn Is Nothing Then<o:p></o:p>
'没找到对应ID的节点<o:p></o:p>
Else<o:p></o:p>
node = New TreeNode<o:p></o:p>
With node<o:p></o:p>
.Tag = ID<o:p></o:p>
.Text = Title<o:p></o:p>
End With<o:p></o:p>
fn.Nodes.Add(node)<o:p></o:p>
End If<o:p></o:p>
Next<o:p></o:p>
BootNode.Expand()<o:p></o:p>
End Function<o:p></o:p>
<o:p></o:p>
'在指定的节点下查找ID相符节点<o:p></o:p>
Private Function FindNode(ByVal n As TreeNode, ByVal ID As String) As TreeNode<o:p></o:p>
Dim ns As TreeNodeCollection<o:p></o:p>
Dim node As TreeNode<o:p></o:p>
Dim Flag As Boolean<o:p></o:p>
Dim strText As String<o:p></o:p>
Dim ReturnNode As TreeNode<o:p></o:p>
<o:p></o:p>
Flag = False<o:p></o:p>
<o:p></o:p>
If n.Tag = ID Then<o:p></o:p>
Return n<o:p></o:p>
Else<o:p></o:p>
'如果路径根本不相同则返回<o:p></o:p>
If (ID.Length < DirectCast(n.Tag, String).Length) OrElse ((n.Tag <> "0") AndAlso (ID.Substring(0, n.Tag.Length) <> n.Tag)) Then<o:p></o:p>
Return Nothing<o:p></o:p>
End If<o:p></o:p>
<o:p></o:p>
ns = n.Nodes<o:p></o:p>
For Each node In ns<o:p></o:p>
ReturnNode = FindNode(node, ID)<o:p></o:p>
If ReturnNode Is Nothing Then<o:p></o:p>
'do nothing<o:p></o:p>
Else<o:p></o:p>
Flag = True<o:p></o:p>
Exit For<o:p></o:p>
End If<o:p></o:p>
Next<o:p></o:p>
If Flag = True Then Return ReturnNode<o:p></o:p>
End If<o:p></o:p>
Return Nothing<o:p></o:p>
End Function<o:p></o:p>
<o:p></o:p>
以上的代码利用将当前字节点的ID值存储于Node的Tag中,然后从根目录开始进行遍历进行查找。运行后发现其效率极为低下。但是网上的代码大多如此。<o:p></o:p>
有没有其它方法可以增快其运行速度呢。<o:p></o:p>
神说:“算法要么以空间换时间,要么以时间换空间”。<o:p></o:p>
在某个时候我于是顿悟了。我发现我可以.net提供的HashTable,这可是个好东东。<o:p></o:p>
那么如何来使用它呢?<o:p></o:p>
<o:p></o:p>
二、快速的方法<o:p></o:p>
首先我们需要增加一个定义<o:p></o:p>
Private FastHashTable As Hashtable<o:p></o:p>
然后需要将BuildENTree来做点小调整<o:p></o:p>
Private Function BuildENTree(ByVal ds As DataSet)<o:p></o:p>
Dim rs As DataRowCollection<o:p></o:p>
Dim r As DataRow<o:p></o:p>
Dim ID As String<o:p></o:p>
Dim FatherID As String<o:p></o:p>
Dim Title As String<o:p></o:p>
Dim fn As TreeNode<o:p></o:p>
Dim node As TreeNode<o:p></o:p>
<o:p></o:p>
rs = ds.Tables(0).Rows<o:p></o:p>
BootNode = New TreeNode<o:p></o:p>
BootNode.Text = "[0] 所有单位"<o:p></o:p>
BootNode.Tag = "0" '根目录<o:p></o:p>
treeEN.Nodes.Add(BootNode)<o:p></o:p>
FastHashTable.Add("0", BootNode)<o:p></o:p>
<o:p></o:p>
For Each r In rs<o:p></o:p>
ID = DirectCast(r.Item(0), String).Trim 'CODE<o:p></o:p>
FatherID = DirectCast(r.Item(1), String).Trim 'FATHERCODE<o:p></o:p>
Title = "[" & ID & "] " & DirectCast(r.Item(2), String).Trim 'TITLE<o:p></o:p>
'查找与父节点ID相同的节点<o:p></o:p>
fn = FindNode(FatherID)<o:p></o:p>
If fn Is Nothing Then<o:p></o:p>
'没找到对应ID的节点<o:p></o:p>
Else<o:p></o:p>
node = New TreeNode<o:p></o:p>
With node<o:p></o:p>
.Tag = ID<o:p></o:p>
.Text = Title<o:p></o:p>
End With<o:p></o:p>
fn.Nodes.Add(node)<o:p></o:p>
FastHashTable.Add(ID, node)<o:p></o:p>
End If<o:p></o:p>
Next<o:p></o:p>
BootNode.Expand()<o:p></o:p>
End Function<o:p></o:p>
从以上代码看出,我只是增加了两处黑体的代码,它的作用就是将新增的节点不仅存到TreeView中,还要存到FashHashTable中,其关键字是ID值,只要没有重复的ID,那么就可以使用。<o:p></o:p>
接下来我们还需要对FindNode进行改变。<o:p></o:p>
'新版的快速查找<o:p></o:p>
Private Function FindNode(ByVal ID As String) As TreeNode<o:p></o:p>
Return FastHashTable.Item(ID)<o:p></o:p>
End Function <o:p></o:p>
好了,现在还有一个工作要做,就是要将FastHashTable进行初使化,尽量将其初使化成与你将要构建的数据节点数相同,我这个系统中是3000个节点,因此我增加了以下一句:<o:p></o:p>
FastHashTable = New Hashtable(3000) '数量<o:p></o:p>
现在,这个树已经很快了。<o:p></o:p>
三、后记<o:p></o:p>
即使是在.net时代,数据结构对我们也是很有用的。今天就到这儿吧!<o:p></o:p>
分享到:
相关推荐
5. **性能优化**:了解在处理大量数据时,如何通过分页、缓存、异步加载等方法提高Treeview的性能。 6. **用户体验**:探讨如何设计友好的用户交互,如动画效果、拖放操作、节点展开速度控制等,以提升用户体验。 ...
在ASP.NET开发中,`TreeView`控件和`DropDownList`控件经常被用来构建具有层级结构的数据展示和交互。本示例中的“Treeview和dropdownlist无限极分类添加删除”是一个实用的功能,它允许用户在界面上无限制地添加、...
3. **视图构建**:在适配器的`getView()`方法中,根据节点的状态构建视图。通常,节点视图会包含一个可点击的箭头图标,用于展开或折叠子节点。 4. **点击事件处理**:在适配器中,监听箭头图标或整个节点的点击...
在Windows编程中,尤其是使用C#或Visual Basic .NET时,常常会用到TreeView控件来构建这样的界面。这个项目可能涉及到以下几个关键知识点: 1. **TreeView控件**:在Windows Forms或WPF应用程序中,TreeView控件是...
综上所述,Vue3 Treeview 是一个基于Vue.js 3和TypeScript构建的树视图组件,它的设计和实现涉及到了Vue 3的新特性、数据结构处理、事件驱动编程以及性能优化等多个方面的知识点。随着项目的进一步发展,它将为...
- 递归算法:在Java中,通常使用递归方法来构建树结构。从根节点开始,遍历所有子节点,每个节点又可能有子节点,如此递归下去直到所有节点都被遍历。 - TreeNode类:定义一个TreeNode类,包含部门ID、名称、父...
使用`TreeView`的`Nodes.Add()`方法添加根节点,然后调用上述递归方法加载所有子节点。 5. **界面和操作**:描述中提到5个不同的实现可能在UI交互上有所不同,比如拖放功能、节点展开/折叠动画、节点选择事件处理等...
综上所述,"TreeViewTest"项目展示了如何在C#中利用`TreeView`控件构建一个能够动态加载无限层次数据的界面。通过理解并实践这些概念和技术,你可以创建出具有高效、响应迅速且用户友好的树型结构界面。
综上所述,实现JS无限级树形菜单涉及到了数据结构的设计、递归遍历、DOM操作、事件处理、性能优化等多个方面。通过合理的设计和编程实践,我们可以构建出功能丰富且用户体验良好的树形菜单。在实际项目中,结合具体...
SQLiteToTeeView.zip是一个压缩包,包含了将SQLite数据库中的数据转换并显示在Windows Forms应用程序中TreeView控件的完整解决方案。这个项目对于那些需要在GUI界面中以树形结构展示数据库信息的开发者来说非常有用...
通过合理利用DirectoryEntry及其相关方法,我们可以构建出功能丰富的应用程序,例如网络扫描、用户管理、组策略应用等。在实际开发中,需要注意权限控制和错误处理,以确保程序的稳定性和安全性。 参考文献: 1. ...
综上所述,`ReactTree:使用 ReactJs 可拖动 Treeview`项目涉及到React组件化开发、状态管理、递归渲染、第三方库集成、事件处理、样式设计、性能优化以及测试等多个方面,是React开发中的一次全面实践。通过这个项目...
- 创建递归函数,遍历数据模型并构建TreeNode对象。 - 在TreeNode的AfterSelect或Expand事件中,根据当前选中的或展开的节点,调用递归函数加载子节点。 - 最后,初始化树形控件,调用递归函数加载根节点。 5. *...
4. **递归构建**: 为了展示整个目录树,你需要递归地创建每个子目录的节点,直到没有更多的子目录为止。这通常在一个递归函数中完成,该函数接受当前目录作为参数,然后创建一个表示该目录的节点,再调用自身处理每...
在IT领域,尤其是在Web开发中,树形菜单是一种常见的用户界面元素,用于组织和展示层次化的数据。"无限级树形菜单"是指可以容纳...通过深入理解这些技术及其交互,开发者可以构建出更加灵活和高效的树形菜单解决方案。
在ASP.NET中,我们通常使用控件如TreeView来实现这种功能,但结合jQuery,我们可以创建更灵活、更高效的解决方案。 在jQuery中,我们可以利用HTML的`<ul>`和`<li>`元素构建基本的菜单结构。每个`<li>`代表一个菜单...
2. **加载目录树**:使用Directory类获取磁盘根目录,递归填充TreeView。 3. **响应TreeView选中事件**:当用户选择一个节点时,更新ListView显示对应目录下的文件。 4. **实现文件操作**:编写打开、复制、移动、...
3. **遍历和递归**:为了构建或遍历树结构,我们需要使用递归函数。这允许我们遍历树的所有层级,根据需要展开或折叠节点。 4. **事件处理**:节点的点击、展开和折叠等交互通常需要绑定事件监听器。例如,点击一个...
《MyFileHelper.zip——C#实现的文件目录管理器详解》 在计算机科学领域,文件管理是操作系统中的重要组成...通过深入理解C#语言及其相关库,我们可以构建出强大且易用的文件管理解决方案,满足日常工作的各种需求。
9. 插件和库:有许多现成的JS库,如jQuery Treeview、Angular UI Tree、jstree等,可以帮助快速构建目录树,它们提供了丰富的API和配置选项。 这些JS目录树实现的差异可能在于它们的性能、可定制性、动画效果、是否...