Foxtable(狐表)用户栏目专家坐堂 → 五级目录树的建立


  共有3760人关注过本帖树形打印复制链接

主题:五级目录树的建立

帅哥哟,离线,有人找我吗?
weibu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
五级目录树的建立  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/8/1 17:49:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By: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 & ")")

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106028 积分:539233 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2020/5/30 8:45:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2020/5/30 8:51:00 [只看该作者]

我现在的想的最优方案,一条数据包含上级部门这个字段。通过上级部门这个字段能否生产无限极目录树?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106028 积分:539233 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/30 9:38:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By: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()

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106028 积分:539233 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:641 积分:5194 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2020/5/30 15:41:00 [只看该作者]

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





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

 回到顶部
总数 12 1 2 下一页