Ich habe das Video nicht angeschaut, erkenne aber das Problem.
Beim Click auf den Button "btn" werden die gecheckten Nodes gelistet,
aber bei schneller Click-Wiederholung klappt beim Treeview die
Koordination zwischen der Anzeige des Node-Check und zurückgegebenen
Check-Eigenschaft des Node nicht.
Workaround: Eventuell die Knoten selbst zeichen
Public Class frmCheckedNodes
Dim WithEvents trv As New TreeView With _
{.Parent = Me, .Width = 200, .CheckBoxes = True, _
.DrawMode = TreeViewDrawMode.OwnerDrawAll}
Dim CheckedNodes As New List(Of String)
Dim bs As New BindingSource With {.DataSource = CheckedNodes}
Dim lbo As New ListBox With _
{.Parent = Me, .Left = 210, .Top = 40, .DataSource = bs}
Dim WithEvents btn As New Button With _
{.Parent = Me, .Left = 210, .Text = "Checked Nodes"}
Private Sub frmCheckedNodes_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
FillTree()
End Sub
Private Sub btn_Click(sender As Object, _
e As System.EventArgs) Handles btn.Click
CheckedNodes.Clear()
ListCheckedNodes(trv, CheckedNodes)
bs.ResetBindings(False)
End Sub
Private Sub HandleMouseDown(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles trv.MouseDown
Dim info As TreeViewHitTestInfo = trv.HitTest(e.X, e.Y)
If (info IsNot Nothing) Then
info.Node.Checked = Not info.Node.Checked
End If
End Sub
Private Sub trv_DrawNode(sender As Object, _
e As System.Windows.Forms.DrawTreeNodeEventArgs) Handles trv.DrawNode
Dim f As Font = e.Node.NodeFont
If f Is Nothing Then f = trv.Font
Dim c As Color = Color.Black
If e.Node.Checked Then c = Color.Red
Using br As New SolidBrush(c)
e.Graphics.DrawString(e.Node.Text, f, br, e.Node.Bounds.Location)
End Using
End Sub
Private Sub FillTree()
For i As Integer = 0 To 5
Dim sn As TreeNode = trv.Nodes.Add(CStr(i), CStr(i))
For k As Integer = 0 To 5
sn.Nodes.Add(CStr(i) + CStr(k), CStr(i) & CStr(k))
Next k
Next i
End Sub
Private Sub ListCheckedNodes(ByVal trv As TreeView, _
ByVal lst As List(Of String))
For Each node As TreeNode In trv.Nodes
If node.Checked Then
lst.Add(node.FullPath)
End If
For Each sn As TreeNode In node.Nodes
CheckedNodesRecursive(sn, lst)
Next sn
Next
End Sub
Private Sub CheckedNodesRecursive(ByVal tn As TreeNode, _
ByVal lst As List(Of String))
If tn.Checked Then
lst.Add(tn.FullPath)
End If
For Each sn As TreeNode In tn.Nodes
CheckedNodesRecursive(sn, lst)
Next
End Sub
End Class
Beitrag wurde zuletzt am 27.05.14 um 16:05:39 editiert. |