Office中国论坛/Access中国论坛

标题: 代码正确运行了,但treeview为何没有正常加载数据呢? [打印本页]

作者: 三个太阳    时间: 2015-7-7 18:11
标题: 代码正确运行了,但treeview为何没有正常加载数据呢?
本帖最后由 三个太阳 于 2015-7-8 10:39 编辑

想用一段比较简单的代码为treeview加载数据,但是只能加二级项目,三级和四级加不了,
测试了一天,实在不明白哪里出了问题?请坛友过目一下:[attach]56777[/attach]
1、表的结构:
[attach]56766[/attach]
2、我的代码:
Option Compare Database
Option Explicit
Private Sub Command1_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from 学生表")
On Error Resume Next '此句是用来处理下面循环里面Index语句的
ActiveXCtl0.nodes.Add , , "学生管理", "学生管理"
With rs
Do Until .EOF
        If ActiveXCtl0.nodes(.Fields(2)).Index < 0 Then
        ActiveXCtl0.nodes.Add "学生管理", 4, .Fields(2), .Fields(2)
        End If
        If ActiveXCtl0.nodes(.Fields(3)).Index < 0 Then
        ActiveXCtl0.nodes.Add .Fields(2), 4, .Fields(3), .Fields(3)
        End If
        ActiveXCtl0.nodes.Add .Fields(3), 4, .Fields(1), .Fields(1)
.MoveNext
Loop
End With
End Sub
3、下面是运行结果:(年级下面没有班级和姓名)
[attach]56767[/attach]

作者: leonshi    时间: 2015-7-8 08:43
你的表结构好像有问题,没有父节点字段是哪个?我没有看出来
作者: 三个太阳    时间: 2015-7-8 08:49
leonshi 发表于 2015-7-8 08:43
你的表结构好像有问题,没有父节点字段是哪个?我没有看出来

表结构应该没问题吧,年级还可以加上去,但是感觉年级加上去虽然表面上显示出来加上去了,但treeview好像感觉不到,所以导致了,年级下的班级以及姓名找不到父节点而加不上去。烦请leonshi老师共同研究一下。
作者: todaynew    时间: 2015-7-8 09:17
年级、班级在数据表冗余,不宜用非正常逻辑处理应由正常逻辑易于处理的事物。
作者: 三个太阳    时间: 2015-7-8 09:41
todaynew 发表于 2015-7-8 09:17
年级、班级在数据表冗余,不宜用非正常逻辑处理应由正常逻辑易于处理的事物。

版主说得对,我在网上看见了一个示例,表的结构和这个一模一样,我的代码和他的不同,他的可以运行!我感觉我的这个代码在逻辑上没什么问题吧
作者: leonshi    时间: 2015-7-8 10:18
三个太阳 发表于 2015-7-8 08:49
表结构应该没问题吧,年级还可以加上去,但是感觉年级加上去虽然表面上显示出来加上去了,但treeview好像 ...

把你做的示例上传,我看了你那个教程,我没有看出来你是按照那个教材做的啊
作者: 三个太阳    时间: 2015-7-8 10:27
本帖最后由 三个太阳 于 2015-7-8 10:31 编辑

这是我的例子。[attach]56774[/attach]

作者: 风中漫步    时间: 2015-7-8 10:29
On Error Resume Next '此句是用来处理下面循环里面Index语句的
注释掉这句有什么反映
作者: 三个太阳    时间: 2015-7-8 10:32
风中漫步 发表于 2015-7-8 10:29
On Error Resume Next '此句是用来处理下面循环里面Index语句的
注释掉这句有什么反映

老师你看看我的例子。[attach]56775[/attach]

作者: 三个太阳    时间: 2015-7-8 10:34
leonshi 发表于 2015-7-8 10:18
把你做的示例上传,我看了你那个教程,我没有看出来你是按照那个教材做的啊

好的,这是我做的。[attach]56776[/attach]

作者: 三个太阳    时间: 2015-7-8 10:37
三个太阳 发表于 2015-7-8 10:32
老师你看看我的例子。

这个附件里面有,您看看
作者: 风中漫步    时间: 2015-7-8 13:14
试了一下,有点麻烦.建议你看看todaynew斑竹的相关示例

你的代码能装到年级一层还算不错.它的判断方法返回的结果不能保证唯一.index挺陌生,好像没用过,大概是判断节点是否存在的,没猜错不存在的返回值是-1吧.如果你非有使用这种方式的爱好,建议你用判断路径的方法来试试.我测试可行,效果:
[attach]56780[/attach]

作者: roych    时间: 2015-7-8 14:01
缺乏子节点的添加操作,供参考。
http://www.office-cn.net/thread-119551-1-1.html
请留意里面的AddChildNode函数。
以下是kingkang的实例,里面使用了递归算法,相对更复杂些许。
http://www.office-cn.net/thread-66634-1-1.html
作者: 三个太阳    时间: 2015-7-8 15:34
风中漫步 发表于 2015-7-8 13:14
试了一下,有点麻烦.建议你看看todaynew斑竹的相关示例

你的代码能装到年级一层还算不错.它的判断方法返 ...

是的,index属性是返回某个节点的索引值!我的代码就是用index判断是否已经存在该节点,若不存在,这时候系统会提示错误的所以我才会用on error resume next 语句来让他继续执行以添加;若存在这条记录了则不再添加了。不管怎样学生姓名都是要加上去的。
总体感觉思路还是蛮清晰的,但就是不知道这种方法的漏洞在哪里?
作者: 三个太阳    时间: 2015-7-8 15:38
roych 发表于 2015-7-8 14:01
缺乏子节点的添加操作,供参考。
http://www.office-cn.net/thread-119551-1-1.html
请留意里面的AddChil ...

谢谢roych老师,能帮学生指点一下我的代码的漏洞在哪儿吗?理论上我感觉确实没问题。
作者: todaynew    时间: 2015-7-8 15:52
三个太阳 发表于 2015-7-8 09:41
版主说得对,我在网上看见了一个示例,表的结构和这个一模一样,我的代码和他的不同,他的可以运行!我感 ...

http://www.office-cn.net/thread-120167-1-1.html
作者: roych    时间: 2015-7-8 16:20
三个太阳 发表于 2015-7-8 15:38
谢谢roych老师,能帮学生指点一下我的代码的漏洞在哪儿吗?理论上我感觉确实没问题。

键值(key)有问题,请对比你的代码。
  1. Private Sub Command1_Click()
  2. Dim rs As Recordset
  3. Set rs = CurrentDb.OpenRecordset("select * from 学生表")
  4. On Error Resume Next '此句是用来处理下面循环里面Index语句的
  5. ActiveXCtl0.nodes.Add , , "学生管理", "学生管理"
  6. With rs
  7. Do Until .EOF
  8.         If ActiveXCtl0.nodes(.Fields(2)).Index < 0 Then
  9.         ActiveXCtl0.nodes.Add "学生管理", 4, "K" & .Fields(2), .Fields(2)
  10.         End If
  11.         If ActiveXCtl0.nodes(.Fields(3)).Index < 0 Then
  12.         ActiveXCtl0.nodes.Add "K" & .Fields(2), 4, "KK" & .Fields(3), .Fields(3)
  13.         End If
  14.         ActiveXCtl0.nodes.Add "KK" & .Fields(3), 4, "KKK" & .Fields(1), .Fields(1)
  15. .MoveNext
  16. Loop
  17. End With
  18. End Sub
复制代码

作者: 三个太阳    时间: 2015-7-8 16:44
本帖最后由 三个太阳 于 2015-7-8 16:46 编辑
roych 发表于 2015-7-8 16:20
键值(key)有问题,请对比你的代码。

难道是节点的K值不能和节点的text值一样?不过老师的运行结果是这个:
[attach]56784[/attach]

作者: roych    时间: 2015-7-8 16:48
本帖最后由 roych 于 2015-7-8 16:52 编辑
三个太阳 发表于 2015-7-8 16:44
难道是节点的K值不能和节点的text值一样?

key值是唯一的。树控件也是根据key值来判断节点的从属关系的。事实上,也只有在忽略掉错误提示时,这段代码才可以运行,否则还是回出错的。
作者: 风中漫步    时间: 2015-7-8 16:53
roych 发表于 2015-7-8 16:20
键值(key)有问题,请对比你的代码。

好,斑竹.
看了这段代码,觉的这个地方拿不准:
       If ActiveXCtl0.nodes(.Fields(3)).Index < 0 Then
            ActiveXCtl0.nodes.Add "K" & .Fields(2), 4, "KK" & .Fields(3), .Fields(3)
        End If
在装2年级的一班时, ActiveXCtl0.nodes(.Fields(3)).Index会不会给出已存在的情况.

如果测试通过了,那就是我看错了.呵呵,请斑竹告知.谢谢.
作者: 三个太阳    时间: 2015-7-8 16:56
roych 发表于 2015-7-8 16:48
key值是唯一的。树控件也是根据key值来判断节点的从属关系的。事实上,也只有在忽略掉错误提示时,这段代 ...

老师,你看看运行结果貌似有些误差
作者: 风中漫步    时间: 2015-7-8 17:01
发个贴的功夫你们聊了这么多了.
作者: roych    时间: 2015-7-8 17:05
风中漫步 发表于 2015-7-8 16:53
好,斑竹.
看了这段代码,觉的这个地方拿不准:
       If ActiveXCtl0.nodes(.Fields(3)).Index < 0 Then ...

确实存在这个问题。
还是应该改为递归才行。不然的话,这么movenext几下,全都乱套了。
作者: 风中漫步    时间: 2015-7-8 17:11
这种方法感觉比较麻烦啊.再试试循环所有结点,比较路径的方法,看可行吧.
将每个key设为学生管理\年纪\班级
作者: 三个太阳    时间: 2015-7-8 17:28
roych 发表于 2015-7-8 17:05
确实存在这个问题。
还是应该改为递归才行。不然的话,这么movenext几下,全都乱套了。

谢谢老师,我的代码初步设计确实有问题!以下是修改好的:
Private Sub Command1_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from 学生表")
On Error Resume Next '此句是用来处理下面循环里面Index语句的
ActiveXCtl0.nodes.Add , , "学生管理", "学生管理"
With rs
Do Until .EOF
        If ActiveXCtl0.nodes("学生管理" & .Fields(2)).Index < 0 Then
        ActiveXCtl0.nodes.Add "学生管理", 4, "学生管理" & .Fields(2), .Fields(2)
        End If
        If ActiveXCtl0.nodes("学生管理" & .Fields(2) & .Fields(3)).Index < 0 Then
        ActiveXCtl0.nodes.Add "学生管理" & .Fields(2), 4, "学生管理" & .Fields(2) & .Fields(3), .Fields(3)
        End If
        ActiveXCtl0.nodes.Add "学生管理" & .Fields(2) & .Fields(3), 4, "学生管理" & .Fields(2) & .Fields(3) & .Fields(0), .Fields(1)
.MoveNext
Loop
End With
End Sub
作者: 三个太阳    时间: 2015-7-8 17:29
风中漫步 发表于 2015-7-8 17:11
这种方法感觉比较麻烦啊.再试试循环所有结点,比较路径的方法,看可行吧.
将每个key设为学生管理\年纪\班级

谢谢老师啦,看来确实要把key值设定好!
作者: roych    时间: 2015-7-8 17:31
三个太阳 发表于 2015-7-8 17:28
谢谢老师,我的代码初步设计确实有问题!以下是修改好的:
Private Sub Command1_Click()
Dim rs As Re ...

幸亏也只有三层啊。要是多几层,写起来估计也不是一件太愉快的事情了
作者: 三个太阳    时间: 2015-7-8 17:35
roych 发表于 2015-7-8 17:31
幸亏也只有三层啊。要是多几层,写起来估计也不是一件太愉快的事情了

是啊,今天麻烦roych版主以及其他的各位老师了!
作者: WFH6898    时间: 2015-12-3 14:58
看不出来
作者: ssymm    时间: 2016-3-7 19:39
我来看看




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3