Imports System.Windows.Forms
Public Class CheckedTreeView
Inherits TreeView
Public Sub New()
MyBase.DrawMode = TreeViewDrawMode.OwnerDrawAll
MyBase.CheckBoxes = True
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
Dim info As TreeViewHitTestInfo = Me.HitTest(e.X, e.Y)
If info IsNot Nothing AndAlso info.Node IsNot Nothing Then
With info.Node
If e.X > .Bounds.X - 2 And _
e.X < .Bounds.X + .Bounds.Height + 4 Then
'Click auf die Checkbox: Checked oder unchecked
.Checked = Not .Checked
Else
'Click auf den Node-text: collapsed oder expand
If .IsExpanded Then
.Collapse()
Else
.Expand()
End If
End If
End With
End If
End Sub
Protected Overrides Sub OnDrawNode _
(e As System.Windows.Forms.DrawTreeNodeEventArgs)
MyBase.OnDrawNode(e)
Dim checkedcolor As Color = Color.Red
If e.Node.Bounds.Y = 0 And _
Not Me.Nodes(0) Is e.Node Then Exit Sub 'Bug abfangen
With e.Node
Dim f As Font = .NodeFont
If f Is Nothing Then f = Me.Font
Dim c As Color = .ForeColor
If .Checked Then c = checkedcolor
If c.A = 0 Then c = Me.ForeColor 'Knotenfarbe nicht definiert
Using brfore As New SolidBrush(c), _
brback As New SolidBrush(.BackColor), _
p As New Pen(c, 1), _
brTreeBack As New SolidBrush(Me.BackColor)
With .Bounds
'Checkbox für Knoten zeichnen
Dim box As New Rectangle _
(.X + 2, .Y + 2, .Height - 4, .Height - 4)
e.Graphics.DrawRectangle(p, box)
If e.Node.Checked Then
'Checkbox markieren
e.Graphics.DrawLine _
(p, .X, .Y, .X + .Height, .Y + .Height)
e.Graphics.DrawLine _
(p, .X + .Height, .Y, .X, .Y + .Height)
End If
'Text ausgeben (incl. Expand/Collapse-Zeichen)
Dim cs As String
If e.Node.Nodes.Count = 0 Then
cs = ""
Else
'Unterknoten: kollabiert oder expandiert?
If e.Node.IsExpanded Then cs = "(-) " Else cs = "(+) "
End If
e.Graphics.DrawString _
(cs & e.Node.Text, f, brfore, .X + .Height + 4, .Y)
'ggf. Verbindungslinien zu übergeordneten Knoten
Dim n As TreeNode = e.Node
Dim vertical As Boolean = True
While n.Parent IsNot Nothing
Dim start As Integer = _
n.Parent.Bounds.X + .Height \ 2
If vertical Then
e.Graphics.DrawLine _
(p, New Point(start, .Y + .Height \ 2), _
New Point(.X - 4, .Y + .Height \ 2))
vertical = False
End If
e.Graphics.DrawLine(p, _
New Point(start, .Y + .Height), _
New Point(start, _
n.Parent.Bounds.Y + n.Parent.Bounds.Height))
n = n.Parent
End While
End With
End Using
End With
End Sub
''' <summary>Modus, in dem das Control gezeichnet wird (OwnerDrawAll)</summary>
Public Shadows Property Drawmode() As TreeViewDrawMode
Set(value As TreeViewDrawMode)
'
End Set
Get
Return MyBase.DrawMode
End Get
End Property
''' <summary>zu jedem Knoten wird ein Kontrolkästchen angezeigt</summary>
Public Shadows Property Checkboxes() As Boolean
Set(value As Boolean)
'
End Set
Get
Return MyBase.CheckBoxes
End Get
End Property
End Class Klasse in das Projekt aufnehmen und Projekt übersetzen.
Danach findet sich in der Toolbox, Abschnitt <Projektname>,
ein neues Steuerelement.
Zu benutzen wie von Treeview gewohnt -
Scrollable-Eigenschaft auf false setzen, ggf. Scrollen
durch ein Scroll-Control durchführen,
per "Invalidate" das Neuzeichnen des TreeView verwalten.
Beitrag wurde zuletzt am 28.05.14 um 16:10:56 editiert. |