以文本方式查看主题

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

--  作者:weibu
--  发布时间:2018/8/1 17:46:00
--  五级目录树的建立
“编辑目录树之二”是三级目录树的建立,请问五级目录树的下列代码应如何修改

5、“增加子节点”按钮的Click事件代码:

Dim tr As WinForm.TreeView
Dim
nd As WinForm.TreeNode
tr = e.Form.Controls(
"TreeView1")
nd = tr.SelectedNode

If
nd IsNot Nothing Then
   
If nd.Level = 2 Then
        MessageBox.Show(
"最多允许三层节点!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Else
       
Dim dr As DataRow = DataTables("表A").AddNew
        If
nd.Level = 0
Then
            dr(
"大类") = nd.Text
            dr(
"二类") = "新节点"
       
ElseIf nd.Level = 1
            dr(
"大类") = nd.ParentNode.Text
            dr(
"二类") = nd.text
            dr(
"三类") = "新节点"
       
End If
        nd = nd.Nodes.Add(
"新节点")
        tr.SelectedNode = nd
        tr.
Select()
        tr.BeginEdit()

    End
If
End
If

6、“删除”按钮的Click事件代码:

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim
nd As WinForm.TreeNode = tr.SelectedNode
If
nd IsNot Nothing Then
    Dim
pth() As String = nd.FullPath.Split("\\")
    Select
Case nd.Level
    Case
0
       
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\'")
    Case
1
       
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\'")
    Case
2
       
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\' And 三类 = \'" & pth(2) & "\'")
    End
Select
    nd.Delete()
End
If
tr.Select()

7、目录树AfterEditNode事件代码:

If e.NewText = "" Then
   
e.Cancel = True
    Return
End If
Dim
pth() As String = e.Node.FullPath.Split("\\")
Select Case
e.node.Level
    Case
0
        DataTables(
"A").ReplaceFor("大类",e.NewText,"大类 = \'" & pth(0) & "\'")
    Case
1
        DataTables(
"A").ReplaceFor("二类",e.NewText,"大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\'")
    Case
2
        DataTables(
"A").ReplaceFor("三类",e.NewText,"大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\' And 三类 = \'" & pth(2) & "\'")
End Select

e
.Node.Name = e.NewText


--  作者:有点甜
--  发布时间:2018/8/1 17:49:00
--  

建议用这种方式处理

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=99022&replyID=682089&skin=1

 


--  作者:weibu
--  发布时间:2020/5/29 18:50:00
--  
老师我下面的代码如何修改,仅生成一条数据。而不是生成多条数据再删除

Dim dt As DataTable = DataTables("department")
Dim dic As New Dictionary(of Integer, Integer)
Dim prevLevel As Integer = 0
Dim idxs As String = "-1,"
For Each nd As WinForm.TreeNode In e.Form.Controls("TreeView1").AllNodes
    If nd.Level = 0 AndAlso dic.count > 0 Then
        Dim temp = dic(0)
        dic.Clear
        dic.Add(0, temp)
    End If
    
    If dic.ContainsKey(nd.Level) = False Then
        dic.Add(nd.Level, 1)
    Else
        dic(nd.Level) = dic(nd.Level) + 1
    End If
    For i As Integer = nd.level + 1 To prevLevel
        dic(i) = 0
    Next
    
    prevLevel = nd.Level
    Dim ndr As DataRow
    If nd.DataRow IsNot Nothing Then
        ndr = dt.Find("_Identify = " & nd.DataRow("_Identify"))
    Else
        ndr = dt.AddNew      
    End If
    idxs &= ndr("_Identify") & ","
    Dim str As String = ""
    For i As Integer = 0 To nd.Level
        str &= format(dic(i), "000") & "."
    Next
    ndr("departno") = str.TrimEnd(".")
    ndr("department") = nd.Text
Next
\' dt.DeleteFor("_Identify not in (" & idxs & ")")

--  作者:有点蓝
--  发布时间:2020/5/30 8:41:00
--  
2楼这种用法不适合改为一条数据。
还是以“编辑目录树之二”为例,比如再多一级:

2、窗口的AfterLoad事件代码为:

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
tr.BuildTree(
"表A""大类|二类|三类|四类"
)


5、“增加子节点”按钮的Click事件代码:

Dim tr As WinForm.TreeView
Dim
 nd As WinForm.TreeNode
tr = e.Form.Controls(
"TreeView1")
nd = tr.SelectedNode

If
 nd IsNot Nothing Then
    
If nd.Level = 3 Then
        MessageBox.Show(
"最多允许四层节点!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Else
        
Dim dr As DataRow = DataTables("表A").AddNew
        If
 nd.Level = 0 
Then
            dr(
"大类") = nd.Text
            dr(
"二类") = "新节点"
        
ElseIf nd.Level = 1
            dr(
"大类") = nd.ParentNode.Text
            dr(
"二类") = nd.text
            dr(
"三类") = "新节点"

        ElseIf nd.Level = 2
            dr(
"大类") = nd.ParentNode.ParentNode.Text

            dr("二类") = nd.ParentNode.Text
            dr(
"类") = nd.text
            dr(
"四类") = "新节点"
        
End If
        nd = nd.Nodes.Add(
"新节点")
        tr.SelectedNode = nd
        tr.
Select()
        tr.BeginEdit()

    End
 
If
End
 If


6、“删除”按钮的Click事件代码:

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim
 nd As WinForm.TreeNode = tr.SelectedNode
If
 nd IsNot Nothing Then
    Dim
 pth() As String = nd.FullPath.Split("\\")
    Select
 Case nd.Level
    Case
 0
        
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\'")
    Case
 1
        
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\'")
    Case
 2
        
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\' And 三类 = \'" & pth(2) & "\'")

    Case 3
        
DataTables("
A").DeleteFor("大类 = \'" & pth(0) & "\' And 二类 = \'" & pth(1) & "\' And 三类 = \'" & pth(2) & "\' And 四 = \'" & pth(3) & "\'")

    End Select
    nd.Delete()
End
 If
tr.Select()


--  作者:weibu
--  发布时间:2020/5/30 8:45:00
--  
蓝老师,这种方法目录树的层级就收到限制了。我这边是想做部门的目录层级。部门目录树估计能达9级左右。
[此贴子已经被作者于2020/5/30 8:53:38编辑过]

--  作者:weibu
--  发布时间:2020/5/30 8:51:00
--  
我现在的想的最优方案,一条数据包含上级部门这个字段。通过上级部门这个字段能否生产无限极目录树?
--  作者:有点蓝
--  发布时间:2020/5/30 9:38:00
--  
使用递归:http://www.foxtable.com/webhelp/topics/2416.htm
--  作者:weibu
--  发布时间:2020/5/30 15:29:00
--  
老师生产目录树的表和编辑下拉窗口所在的表是同一张表。
NodeMouseClick设置下列代码,点击目录树后提示“未将对象引用设置到对象的实例。
Dim tr As Row = Tables("department").Current
Dim dr As DataRow = e.Node.DataRow \'获取生成此节点的DataRow
        tr("parent") = dr("departname")
        tr("parentID") = dr("departID")
        e.Form.DropDownBox.Value = tr("departname") \'这行不是多余的,省略此行,无法在表中正常使用此下拉窗口输入数据.
        e.Form.DropDownBox.CloseDropdown()

--  作者:有点蓝
--  发布时间:2020/5/30 15:31:00
--  
判断一下有没有值
Dim tr As Row = Tables("department").Current
if tr is  nothing then return
Dim dr As DataRow = e.Node.DataRow \'获取生成此节点的DataRow
if dr isnot nothing then
        tr("parent") = dr("departname")
        tr("parentID") = dr("departID")
        e.Form.DropDownBox.Value = tr("departname") \'这行不是多余的,省略此行,无法在表中正常使用此下拉窗口输入数据.
        e.Form.DropDownBox.CloseDropdown()
end if

[此贴子已经被作者于2020/5/30 16:01:37编辑过]

--  作者:weibu
--  发布时间:2020/5/30 15:41:00
--  
老师修改后点击某个目录树某个节点没反应。Dim tr As Row = Tables("department").Current   ,department表取数据生产的目录树tree1。现在点击department的上级部门列,出来下拉窗口中的目录树就是tree1。
这样是不是不行?
就是希望点击部门信息表中的“上级部门”可以达到代码中的赋值
老师还希望目录树中的排列顺序按排序号值进行排序。
事列:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.zip





[此贴子已经被作者于2020/5/30 15:48:54编辑过]