Foxtable(狐表)用户栏目专家坐堂 → [求助]关于TreeView的求助


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

主题:[求助]关于TreeView的求助

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]关于TreeView的求助  发帖心情 Post By:2015/8/5 14:32:00 [只看该作者]


项目中有一指定经办人的功能,我用了以下方法实现:
在窗口中有一TreeView,窗口的样子与代码如下:

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20150805142303.jpg
图片点击可在新窗口打开查看

AfterCheckNode

Dim trv1 As WinForm.TreeView = e.Form.Controls("TreeView1")

Dim trv2 As WinForm.TreeView = e.Form.Controls("TreeView2")

Dim nd1 As WinForm.TreeNode = trv1.SelectedNode

Dim dr As DataRow

If e.Node.ParentNode IsNot Nothing Then '取消父节点的选中标记,因为选中子节点,就不要选中父节点了

    e.Node.ParentNode.Checked = False

End If

For Each cnd As WinForm.TreeNode In e.Node.Nodes '取消子节点的选中标记,因为选中父节点,就不要选中子节点了

    cnd.Checked = False

Next

If nd1.Level = 0 Then

    dr = _dt事务经办人员指派.Find("分组 = '" & nd1.Name & "' And 事务 Is Null")

Else

    dr = _dt事务经办人员指派.Find("分组 = '" & nd1.ParentNode.Name & "' And 事务 = '" & nd1.Name & "'")

End If

If dr IsNot Nothing Then

    Dim nms As String

    For Each nd2 As WinForm.TreeNode In trv2.AllNodes

        If nd2.Checked  Then

            nms  = nms & "," &  nd2.Name

        End If

    Next

    If nms > "" Then

        dr("经办人员") = nms.Trim(",")

    Else

        dr("经办人员") = Nothing

    End If

End If


在后台中有一表,结构如下:


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20150805142530.jpg
图片点击可在新窗口打开查看


我现在求助的是,假定我在“冷轧作业区”上打个勾,下面的子节点不打勾,在后台的结果如下图:


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20150805142755.jpg
图片点击可在新窗口打开查看
而我现在希望的是在父结点上打了勾后,下面的子结点全部也勾上,这样后台的表上就会有这些员工的名字,方便我在其他表上引用,

但同时,“冷轧作业区”不能出现在后台表上,这个根本不是员工的名字。

谢谢!



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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/8/5 14:44:00 [只看该作者]

Dim trv1 As WinForm.TreeView = e.Form.Controls("TreeView1")

Dim trv2 As WinForm.TreeView = e.Form.Controls("TreeView2")

Dim nd1 As WinForm.TreeNode = trv1.SelectedNode

Dim dr As DataRow

For Each cnd As WinForm.TreeNode In e.Node.AllNodes '取消子节点的选中标记,因为选中父节点,就不要选中子节点了
   
    cnd.Checked = e.node.Checked
   
Next

If nd1.Level = 0 Then
   
    dr = _dt事务经办人员指派.Find("分组 = '" & nd1.Name & "' And 事务 Is Null")
   
Else
   
    dr = _dt事务经办人员指派.Find("分组 = '" & nd1.ParentNode.Name & "' And 事务 = '" & nd1.Name & "'")
   
End If

If dr IsNot Nothing Then
   
    Dim nms As String
   
    For Each nd2 As WinForm.TreeNode In trv2.AllNodes
       
        If nd2.Checked AndAlso nd2.Level > 0 Then
           
            nms  = nms & "," &  nd2.Name
           
        End If
       
    Next
   
    If nms > "" Then
       
        dr("经办人员") = nms.Trim(",")
       
    Else
       
        dr("经办人员") = Nothing
       
    End If
   
   
End If

 


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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/8/5 14:57:00 [只看该作者]

代码可以正常执行了,但有个小改进,老师能不能搞下:
当子节点全部被选中时,父节点也打上勾,在这个经办指派窗口重新打开后,父节点上的勾没有被选中,如果只是部分选中,就不要打勾,其实最理想状态是部分选中后父节点上有个其它标记好让用户知道这个父节点下有被选中的子节点。
[此贴子已经被作者于2015/8/5 14:57:17编辑过]

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/8/5 15:10:00 [只看该作者]

加上下面这段全选的代码

 

For Each nd As WinForm.TreeNode In e.node.AllNodes
    nd.Checked = e.Node.Checked
Next


If e.Node.Checked = False Then
    Dim pnd As WinForm.TreeNode = e.Node.ParentNode
    Do While pnd IsNot Nothing
        pnd.Checked = False
        pnd = pnd.ParentNode
    Loop
Else
    Dim pnd As WinForm.TreeNode = e.Node.ParentNode
    Dim flag As Boolean = True
    Do While pnd IsNot Nothing
        If flag = True
            For Each nd As WinForm.TreeNode In pnd.Nodes
                If nd.Checked = False Then
                    flag = False
                    Exit For
                End If
            Next
        End If
        pnd.Checked = flag
        pnd = pnd.ParentNode
    Loop
End If


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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/8/6 10:51:00 [只看该作者]

这段代码是加上后起到的作用是子节点全选中时,父节点自动选中,但窗口重新打开后,虽然子节点是全选的,但父节点又处于未选中状态。

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20150806105103.jpg
图片点击可在新窗口打开查看


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/8/6 10:55:00 [只看该作者]

 afterLoad事件和左边的目录树的事件要改。

 

 上传实例。


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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/8/6 11:14:00 [只看该作者]

项目内容太多了,实在不方便上传,下面是左边的TreeView代码,应该就在上面改的,老师帮我看看:
AfterSelectNode

Dim trv1 As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim trv2 As WinForm.TreeView = e.Form.Controls("TreeView2")

Dim dr As DataRow
If e.node.Level = 0 Then
    dr = _dt事务经办人员指派.Find("分组 = '" & e.Node.Name & "' And 事务 Is Null")
Else
    dr = _dt事务经办人员指派.Find("分组 = '" & e.Node.ParentNode.Name & "' And 事务 = '" & e.Node.Name & "'")
End If
Dim nms As New List(of String)
If dr IsNot Nothing AndAlso dr.IsNull("经办人员") = False
    nms.AddRange(dr("经办人员").Split(","))
End If
For Each nd As WinForm.TreeNode In trv2.AllNodes
    nd.Checked = nms.Contains(nd.Name)
Next

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/8/6 12:17:00 [只看该作者]

For Each nd As WinForm.TreeNode In trv2.AllNodes
    nd.Checked = nms.Contains(nd.Name)
Next

For Each nd As WinForm.TreeNode In trv2.Nodes
    Dim flag As Boolean = True
    For Each cnd As winform.treeNode In nd.Nodes
        If cnd.Checked = False Then
            flag = False
        End If
    Next
    nd = flag
Next

[此贴子已经被作者于2015/8/6 12:16:53编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/8/6 12:47:00 [只看该作者]

想在老师的代码下增加个当子节点有部分选中时,父节点名旁边会有个"☆",这样用户就能知道这个父节点下面有选中的内容,但改来改去就是不会,下面的代码会让所有的父节点上全带上"☆"
For Each nd As WinForm.TreeNode In trv2.AllNodes
    nd.Checked = nms.Contains(nd.Name)
Next
For Each nd As WinForm.TreeNode In trv2.Nodes
    Dim flag As Boolean = True
    Dim str As String
    For Each cnd As winform.treeNode In nd.Nodes
        If cnd.Checked = False Then
            flag = False
        End If
    Next
    nd.Checked = flag
    
    For Each cnd2 As winform.treeNode In nd.Nodes
        If cnd2.Checked = True Then            
                str = "☆"            
        End If
    Next   
    nd.text = nd.text & str
Next

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/8/6 14:05:00 [只看该作者]

自己搞定了,把代码分享一下:
For Each nd As WinForm.TreeNode In trv2.AllNodes
    nd.Checked = nms.Contains(nd.Name)
Next

For Each nd As WinForm.TreeNode In trv2.Nodes
nd.Text = nd.Text.TrimEnd("★")
    Dim flag As Boolean = True
    For Each cnd As winform.treeNode In nd.Nodes
        If cnd.Checked = False Then
            flag = False
        End If
    Next
    nd.Checked = flag
   
    For Each cnd2 As winform.treeNode In nd.Nodes
        If cnd2.Checked = True Then
            If nd.Text.Contains("★") Then
            Else
                nd.text = nd.text & "★" 
            End If
        End If       
    Next   
Next

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