以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  建立目录树  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=157738)

--  作者:newsun2k
--  发布时间:2020/10/27 11:47:00
--  建立目录树
不知道为何报错了,感觉没啥问题啊?

表a结构和数据
   编码    名称      父编码
   001     文件1    Root
   002     文件2    001
   003     文件3    002
   004     文件4    Root

窗口中调用
Functions.Execute("com创建目录树","Root","共享文件夹","")

函数【com创建目录树】
Dim TreeView1 As WinForm.TreeView = Forms("窗口1").Controls("TreeView1")
Dim strNewNodeCode As String = args(0)
Dim strNewNodeName As String = args(1)
Dim strFatherNodeCode As String = args(2)
Dim cmd As New SQLCommand
cmd.ConnectionName = “连接1”
Dim dt As DataTable
Dim strFilter As String
Dim dr As DataRow

If strNewNodeCode = "Root" Then
    If TreeView1.nodes.Contains(strNewNodeCode) = False Then TreeView1.nodes.Add(strNewNodeCode,strNewNodeCode,"floder.png")   \'建第一级目录

Else

    If TreeView1.nodes(strFatherNodeCode).nodes.Contains(strNewNodeCode) = False Then             \'此处报错  未将对象引用设置到对象的实例。
        TreeView1.nodes(strFatherNodeCode).nodes.Add(strNewNodeCode,strNewNodeCode,"floder.png")   \'建当前目录
    End If

End If

strFilter = " where 父编码 = \'" & strNewNodeCode & "\'"   \'建当前目录的全部子目录

cmd.CommandText = "sele ct 编码,名称,父编码 from 表a " & strFilter 
dt = cmd.ExecuteReader()

For Each dr1 As DataRow In dt.DataRows
    Functions.Execute("com创建目录树",dr1("编码"),dr1("名称"),strNewNodeCode)
Next



--  作者:有点蓝
--  发布时间:2020/10/27 12:07:00
--  
args(2)传入的是一个空字符串,这个节点肯定是不存在的啊:TreeView1.nodes(strFatherNodeCode)。节点肯定要有名称才能访问的
--  作者:newsun2k
--  发布时间:2020/10/27 13:02:00
--  
就第一次调用的时候,这个args(2)是空字符串,后面调用都有的。
第一次调用创建一个root节点,有个判断的。所以没出错。

--  作者:有点蓝
--  发布时间:2020/10/27 13:44:00
--  
就算传入其它名称,也有可能不存在,先判断一下

If TreeView1.nodes.Contains(strFatherNodeCode) andalso TreeView1.nodes(strFatherNodeCode).nodes.Contains(strNewNodeCode) = False Then    

--  作者:有点蓝
--  发布时间:2020/10/27 13:45:00
--  
Elseif TreeView1.nodes.Contains(strFatherNodeCode)

    If TreeView1.nodes(strFatherNodeCode).nodes.Contains(strNewNodeCode) = False Then             \'此处报错  未将对象引用设置到对象的实例。
        TreeView1.nodes(strFatherNodeCode).nodes.Add(strNewNodeCode,strNewNodeCode,"floder.png")   \'建当前目录
    End If

End If

--  作者:newsun2k
--  发布时间:2020/10/27 13:58:00
--  
哦哦哦,应该查到问题了。
TreeView1.nodes(strFatherNodeCode).nodes.Add(“k123”,strNewNodeCode,"floder.png")      ’创建k123节点

再次引用时,TreeView1.nodes(“k123”)这个时候报错,说k123不存在。

需要带上父节点才能引用?


改成这样:
If strNewNodeCode = "Root" Then
    If TreeView1.nodes.Contains(strNewNodeCode) = False Then TreeView1.nodes.Add(strNewNodeCode,strNewNodeCode,"floder.png")   \'建第一级目录

Else
if TreeView1.nodes.Contains(strFatherNodeCode) then
    If TreeView1.nodes(strFatherNodeCode).nodes.Contains(strNewNodeCode) = False Then             \'此处报错  未将对象引用设置到对象的实例。
        TreeView1.nodes(strFatherNodeCode).nodes.Add(strNewNodeCode,strNewNodeCode,"floder.png")   \'建当前目录
msgbox(strNewNodeCode & "已加入!")
    End If
else
msgbox(strFatherNodeCode & "不存在!")
end if

End If

提示信息为:
---------------------------
zddIP.Function
---------------------------
WJJ2000000004已加入!
---------------------------
确定   
---------------------------
---------------------------
zddIP.Function
---------------------------
WJJ2000000004不存在!
---------------------------
确定   
---------------------------

--  作者:有点蓝
--  发布时间:2020/10/27 14:07:00
--  
TreeView1.nodes(strFatherNodeCode).nodes.Add(“k123”,   --  是加到第二级节点

TreeView1.nodes(“k123”)是第一级节点,肯定出错啊

--  作者:newsun2k
--  发布时间:2020/10/27 14:14:00
--  
嗯嗯,那咋整?我要引用"k123",它完整的父节点结构不知道了啊。咋引用?
--  作者:有点蓝
--  发布时间:2020/10/27 14:23:00
--  
加上父节点的完整引用

TreeView1.nodes(strFatherNodeCode).nodes
(“k123”)