Часть рисования верна, хотя ее можно упростить: одни и те же методы могут использоваться как для фона, так и для визуализации текста, DRY до кода.
Logi c в событии MouseDown требует частичного рефакторинга, поэтому выбранные и невыбранные узлы фактически добавляются и удаляются из коллекции узлов, поля nodelist
.
TreeView также должен быть уведомлен об изменении, вызывая его метод Invalidate()
, чтобы элемент управления мог перерисовать новый выбор узлов (Invalidate()
вызывает элемент управления для перерисовки себя, вызывая его Paint
или аналогичное связанное событие: в данном случае событие DrawNode
).
Упрощенный метод рисования:
► Примечание: здесь я Я использую e.Node.Bounds
как ограничивающий прямоугольник как для фона, так и для текста узла. Вместо него можно использовать e.Bounds
, если прямоугольник кажется слишком узким в реальной реализации. Для тестирования (в данном случае это можно рассматривать как вопрос предпочтения).
Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
Console.WriteLine(e.Node.Text & " Rewritten")
Dim backColor As Color = Color.Black
Dim foreColor As Color = Color.White
If nodelist.Contains(e.Node) Then
backColor = Color.Chartreuse
foreColor = Color.Black
End If
e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
Событие MouseDown добавляет текущий выбранный узел в коллекцию nodelist
, если это еще не сделано там, иначе узел удаляется из коллекции. Другое условие проверяется перед добавлением выбранного узла в коллекцию: коллекция не может содержать более 4 элементов; если коллекция уже полная , выбранный узел не добавляется.
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
If nodelist.Contains(clickedNode) Then
nodelist.Remove(clickedNode)
Else
If nodelist.Count < 4 Then
nodelist.Add(clickedNode)
TreeView1.SelectedNode = clickedNode
End If
End If
TreeView1.Invalidate()
End Sub