是否可以在Microsoft TreeView Control 6.0(MSComctlLib.TreeCtrl.2)中模拟三态复选框?

马蒂·布朗(Matti Brown)

我在Microsoft Access中使用Microsoft TreeView Control 6.0。它似乎工作得很好,除了它似乎没有变灰的状态外,这表明已检查了一些(但不是全部)子节点。

我已经研究过使用自己的图像来模拟复选框,但是如果执行此操作,则必须删除真实的复选框,或者看起来每个项目都有两个复选框...但是然后我没有任何复选框复选框,我不知道如何处理图片点击。

我可以在其他语言/用途中找到很多与此控件有相同问题的人,但是找不到Microsoft Access的解决方案。

如果有其他可用的东西可以为我提供带有三态复选框的层次结构,我很乐意转到其他控件。

马蒂·布朗(Matti Brown)

经过一些研究和几个小时的编码,我自己编写了一个解决方案。

我必须添加一个ImageList,将其关联到TreeView,并为这三个状态的每一个添加一个复选框的图像。Google图片搜索为我节省了一些时间:)。

'Enumeration for simulated tri-state checkboxes, matching up to the TreeView's associated Image List's Index
Private Enum CheckboxEnum
  Unchecked = 1
  Checked = 2
  Partial = 3
End Enum

'---------------------------------------------------------------------------------------
' Procedure : objTreeView_MouseDown
' Author    : Matty Brown
' Date      : 19/05/2014
' Purpose   : Because TreeView doesn't support tri-state checkboxes, these have to be simulated using images.
'---------------------------------------------------------------------------------------
'
Private Sub objTreeView_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
  Const CHECKBOX_WIDTH As Integer = 195 '195=13px

  Dim objNode As Node
  Set objNode = objTreeView.HitTest(x, y)

  If objNode Is Nothing Then
    'Miss
  Else
    'Find left side of node by moving left one pixel at a time until you fall off the node, then move one pixel to the right
    Dim intX As stdole.OLE_XPOS_PIXELS
    For intX = x To 0 Step -15
      If Not objNode Is objTreeView.HitTest(intX, y) Then
        If x <= intX + CHECKBOX_WIDTH Then
          'User clicked on the checkbox
          Select Case objNode.Image
            Case CheckboxEnum.Unchecked:
              objNode.Image = CheckboxEnum.Checked
            Case Else:
              objNode.Image = CheckboxEnum.Unchecked
          End Select

          'Recursively check child nodes
          Call CheckTreeNodes(objTreeView, objNode, objNode.Image)

          'Update parent node(s)
          Call UpdateParentNodes(objTreeView, objNode)
        Else
          'User clicked outside of the checkbox
          '
        End If

        Exit For
      End If
    Next
  End If
End Sub

'---------------------------------------------------------------------------------------
' Procedure : CheckTreeNodes
' Author    : Matty Brown
' Date      : 16/05/2014
' Purpose   : Checks or unchecks all of the child nodes for the specified node
'---------------------------------------------------------------------------------------
'
Private Sub CheckTreeNodes(ByRef tv As TreeView, ByRef nodNode As Node, ByVal Value As CheckboxEnum)
  Dim lngIndex As Long

  'Cascade change to children
  If nodNode.Children > 0 Then
    lngIndex = nodNode.Child.Index
    Call CheckTreeNodes(tv, tv.Nodes(lngIndex), Value)

    Do While lngIndex <> nodNode.Child.LastSibling.Index
      lngIndex = tv.Nodes(lngIndex).Next.Index
      Call CheckTreeNodes(tv, tv.Nodes(lngIndex), Value)
    Loop
  End If

  nodNode.Image = Value
End Sub

'---------------------------------------------------------------------------------------
' Procedure : CountChildNodes
' Author    : Matty Brown
' Date      : 19/05/2014
' Purpose   : Counts how many child nodes are checked or unchecked, so that a parent node can be set correctly
'---------------------------------------------------------------------------------------
'
Private Sub CountChildNodes(ByRef tv As TreeView, ByRef nodNode As Node, ByRef lngChecked As Long, ByRef lngUnchecked As Long)
  Dim lngIndex As Long

  'Check this node's children
  If nodNode.Children > 0 Then
    lngIndex = nodNode.Child.Index
    Call CountChildNodes(tv, tv.Nodes(lngIndex), lngChecked, lngUnchecked)

    Do While lngIndex <> nodNode.Child.LastSibling.Index
      lngIndex = tv.Nodes(lngIndex).Next.Index
      Call CountChildNodes(tv, tv.Nodes(lngIndex), lngChecked, lngUnchecked)
    Loop
  Else
  'Update totals
    Select Case nodNode.Image
      Case CheckboxEnum.Checked:
        lngChecked = lngChecked + 1
      Case CheckboxEnum.Unchecked:
        lngUnchecked = lngUnchecked + 1
    End Select
  End If
End Sub


'---------------------------------------------------------------------------------------
' Procedure : UpdateParentNodes
' Author    : Matty Brown
' Date      : 19/05/2014
' Purpose   : Steps through parent nodes, updating them according to how many checked/unchecked child nodes they have
'---------------------------------------------------------------------------------------
'
Private Sub UpdateParentNodes(ByRef tv As TreeView, ByRef nodNode As Node)
  Dim lngIndex As Long
  Dim nodParent As Node
  Dim lngChecked As Long, lngUnchecked As Long

  'If this node has no parents, there's nothing to update
  If nodNode.Parent Is Nothing Then Exit Sub
  Set nodParent = nodNode

  Do While Not nodParent.Parent Is Nothing
    Set nodParent = nodParent.Parent

    'Reset counters
    lngUnchecked = 0
    lngChecked = 0

    'Count children
    Call CountChildNodes(tv, nodParent, lngChecked, lngUnchecked)

    'Update parent nodes
    If lngUnchecked = 0 And lngChecked > 0 Then
      nodParent.Image = CheckboxEnum.Checked
    ElseIf lngUnchecked > 0 And lngChecked > 0 Then
      nodParent.Image = CheckboxEnum.Partial
    Else
      nodParent.Image = CheckboxEnum.Unchecked
    End If
  Loop
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以在Microsoft TreeView Control 6.0(MSComctlLib.TreeCtrl.2)中模拟三态复选框?

来自分类Dev

Firemonkey复选框:Windows和MacOS平台上是否可以使用三态选项?

来自分类Dev

在wxPython中更新treectrl

来自分类Dev

JavaFX三态复选框

来自分类Dev

Office 功能区中的三态复选框

来自分类Dev

是否可以在 ListView 中添加 TreeView

来自分类Dev

在类的Treeview Control中显示从网页抓取的结果

来自分类Dev

避免单击以摆脱笔记本中的wxPython TreeCtrl

来自分类Dev

在angularjs中实现单个三态复选框的最佳方法是什么?

来自分类Dev

如何在iOS XCode中具有“三态”复选框/开关?

来自分类Dev

在WPF三态复选框中捕获不确定状态

来自分类Dev

Javafx:如何在 TreeTableView 中实现三态复选框

来自分类Dev

使用VB6将缺少的节点从Treeview1添加到Treeview2

来自分类Dev

防止用户更改TreeView中的复选框

来自分类Dev

在TreeView上设置复选框的样式

来自分类Dev

TreeView复选框可用作C#.Net中的单个和单独的复选框

来自分类Dev

Verilog三态问题(Xilinx Spartan 6)

来自分类Dev

具有不确定状态的问号的三态复选框插件

来自分类Dev

是否可以在样式化组件中不使用三元的情况下根据复选框的状态设置复选框的子项样式?

来自分类Dev

RTCPeerConnection是否可以在Microsoft Edge中工作?

来自分类Dev

无法使用互斥复选框实现Treeview

来自分类Dev

Kendo Treeview复选框由ID选中

来自分类Dev

以编程方式检查自定义Treeview复选框

来自分类Dev

使用节点和复选框创建TreeView

来自分类Dev

kendoUI MVVM-带有复选框模板的TreeView

来自分类Dev

带有复选框和单选按钮的TreeView

来自分类Dev

仅为Treeview父节点添加复选框WPF

来自分类Dev

将Check设置为treeView复选框

来自分类Dev

带有复选框的TreeView(动态填充)

Related 相关文章

  1. 1

    是否可以在Microsoft TreeView Control 6.0(MSComctlLib.TreeCtrl.2)中模拟三态复选框?

  2. 2

    Firemonkey复选框:Windows和MacOS平台上是否可以使用三态选项?

  3. 3

    在wxPython中更新treectrl

  4. 4

    JavaFX三态复选框

  5. 5

    Office 功能区中的三态复选框

  6. 6

    是否可以在 ListView 中添加 TreeView

  7. 7

    在类的Treeview Control中显示从网页抓取的结果

  8. 8

    避免单击以摆脱笔记本中的wxPython TreeCtrl

  9. 9

    在angularjs中实现单个三态复选框的最佳方法是什么?

  10. 10

    如何在iOS XCode中具有“三态”复选框/开关?

  11. 11

    在WPF三态复选框中捕获不确定状态

  12. 12

    Javafx:如何在 TreeTableView 中实现三态复选框

  13. 13

    使用VB6将缺少的节点从Treeview1添加到Treeview2

  14. 14

    防止用户更改TreeView中的复选框

  15. 15

    在TreeView上设置复选框的样式

  16. 16

    TreeView复选框可用作C#.Net中的单个和单独的复选框

  17. 17

    Verilog三态问题(Xilinx Spartan 6)

  18. 18

    具有不确定状态的问号的三态复选框插件

  19. 19

    是否可以在样式化组件中不使用三元的情况下根据复选框的状态设置复选框的子项样式?

  20. 20

    RTCPeerConnection是否可以在Microsoft Edge中工作?

  21. 21

    无法使用互斥复选框实现Treeview

  22. 22

    Kendo Treeview复选框由ID选中

  23. 23

    以编程方式检查自定义Treeview复选框

  24. 24

    使用节点和复选框创建TreeView

  25. 25

    kendoUI MVVM-带有复选框模板的TreeView

  26. 26

    带有复选框和单选按钮的TreeView

  27. 27

    仅为Treeview父节点添加复选框WPF

  28. 28

    将Check设置为treeView复选框

  29. 29

    带有复选框的TreeView(动态填充)

热门标签

归档