Чекбоксы в ListView - VB

Узнай цену своей работы

Формулировка задачи:

Как добавить чекбоксы в ListView, например как в торренте? Тоесть папка рядом + и чекбокс, нажимаешь + открывается древо и у каждого элемента есть чекбокс. Дальнейшую логику как делать сам пойму, мне хотяб 1 пример с добавлением в родителя и дочерние элементы)

Решение задачи: «Чекбоксы в ListView»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Enum ChkState
  4.     CS_UNCHECKED = 1
  5.     CS_CHECKED = 2
  6.     CS_GRAYED = 3
  7. End Enum
  8. Private Sub Form_Load()
  9.     tvwTree.Nodes.Add , , "main1", "Main 1", CS_UNCHECKED
  10.     tvwTree.Nodes.Add , , "main2", "Main 2", CS_UNCHECKED
  11.     tvwTree.Nodes.Add , , "main3", "Main 3", CS_UNCHECKED
  12.     tvwTree.Nodes.Add "main1", tvwChild, "main1ch1", "Child1", CS_UNCHECKED
  13.     tvwTree.Nodes.Add "main1", tvwChild, "main1ch2", "Child2", CS_UNCHECKED
  14.     tvwTree.Nodes.Add "main1", tvwChild, "main1ch3", "Child3", CS_UNCHECKED
  15.     tvwTree.Nodes.Add "main1ch1", tvwChild, "main1ch1ch1", "Child1", CS_UNCHECKED
  16.     tvwTree.Nodes.Add "main1ch1", tvwChild, "main1ch2ch1", "Child2", CS_UNCHECKED
  17.     tvwTree.Nodes.Add "main1ch1ch1", tvwChild, "main1ch1ch1ch1", "Child1", CS_UNCHECKED
  18.     tvwTree.Nodes.Add "main1ch1ch1", tvwChild, "main1ch2ch1ch1", "Child2", CS_UNCHECKED
  19.     tvwTree.Nodes.Add "main1ch2ch1ch1", tvwChild, "main1ch1ch1ch1ch1", "Child1", CS_UNCHECKED
  20.     tvwTree.Nodes.Add "main1ch2ch1ch1", tvwChild, "main1ch2ch1ch1ch1", "Child2", CS_UNCHECKED
  21.     tvwTree.Nodes.Add "main2", tvwChild, "main2ch2", "Child2", CS_UNCHECKED
  22.     tvwTree.Nodes.Add "main2", tvwChild, "main2ch3", "Child3", CS_UNCHECKED
  23. End Sub
  24.  
  25. Private Sub tvwTree_MouseDown(Button As Integer, Shift As Integer, X As Single, y As Single)
  26.     Dim Sel As Node, Pt As Node
  27.     Dim Lvl As Long
  28.     Dim nX As Long, dx As Long
  29.    
  30.     Set Sel = tvwTree.HitTest(X, y)
  31.    
  32.     If Sel Is Nothing Then Exit Sub
  33.    
  34.     Set Pt = Sel
  35.    
  36.     X = ScaleX(X, vbTwips, vbPixels) - 3
  37.    
  38.     Do Until Pt.Parent Is Nothing
  39.         Set Pt = Pt.Parent
  40.         Lvl = Lvl + 1
  41.     Loop
  42.    
  43.     nX = Lvl * tvwTree.Indentation
  44.     dx = X - nX
  45.    
  46.     If dx <= iglIcon.ImageWidth Then
  47.         If Sel.Image = CS_UNCHECKED Or Sel.Image = CS_GRAYED Then
  48.             Sel.Image = CS_CHECKED
  49.             MarkAllChild Sel, CS_CHECKED
  50.         Else
  51.             Sel.Image = CS_UNCHECKED
  52.             MarkAllChild Sel, CS_UNCHECKED
  53.         End If
  54.        
  55.         MarkAllParents Sel
  56.  
  57.     End If
  58. End Sub
  59. Private Sub MarkAllParents(Child As Node)
  60.     Dim Prnt As Node
  61.     Dim Chld As Node
  62.     Dim Ct As Long
  63.     Dim IsGr As Boolean
  64.    
  65.     Set Prnt = Child.Parent
  66.    
  67.     If Not Prnt Is Nothing Then
  68.         Set Chld = Child.FirstSibling
  69.         Do Until Chld Is Nothing
  70.             If Chld.Image = CS_CHECKED Then
  71.                 Ct = Ct + 1
  72.             ElseIf Chld.Image = CS_GRAYED Then
  73.                 Ct = Ct + 1
  74.                 IsGr = True
  75.                 Exit Do
  76.             End If
  77.             Set Chld = Chld.Next
  78.         Loop
  79.         If Ct = 0 Then
  80.             Prnt.Image = CS_UNCHECKED
  81.         ElseIf IsGr Or Ct < Prnt.Children Then
  82.             Prnt.Image = CS_GRAYED
  83.         ElseIf Ct = Prnt.Children Then
  84.             Prnt.Image = CS_CHECKED
  85.         End If
  86.        
  87.         MarkAllParents Prnt
  88.     End If
  89. End Sub
  90. Private Sub MarkAllChild(Parent As Node, Value As ChkState)
  91.     Dim Chld As Node
  92.    
  93.     Set Chld = Parent.Child
  94.     Do Until Chld Is Nothing
  95.         Chld.Image = Value
  96.         If Chld.Children Then MarkAllChild Chld, Value
  97.         Set Chld = Chld.Next
  98.         DoEvents
  99.     Loop
  100. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут