| |
VB.NET - Fortgeschrittene[Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Seek1 | Datum: 15.12.16 14:33 |
| Hallo Leute,
Möchte bei einem Treeview verschiedene nodes kennzeichnen, ob diese checked sein können.
Selbst unter den childnodes möchte ich differenzieren.
Leider lässt mich VS nur für das ganze Control das "checkable" aktiveren.
Möchte jetzt aber nicht umbeding gleich eine eigene Klasse dafür erstellen.
Hat da jemand Erfahrung damit bzw. auch schon mal gemacht? | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Manfred X | Datum: 15.12.16 19:17 |
| Hallo!
Ich habe diesbezüglich leider keine Erfahrung, aber ....
Schau Dir mal die "DrawMode"-Eigenschaft des Treeview-Control an.
Damit läßt sich das Treeview-Ereignis "DrawNode" anfordern.
Eine Referenz für das jeweils zu zeichnende Node-Objekt liefert
der EventArgs-Parameter.
Das Anclicken eines Knotens durch den Benutzer kann man z.B.
über einen "HitTest" im "MouseDown"-Event des Treeview-Control ermitteln
und den Knoten als "checked" bzw. "unchecked" neu zeichnen lassen.
Eventuell kannst Du damit etwas basteln .... | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Seek1 | Datum: 16.12.16 07:38 |
| Das funktioniert leider nicht.
Das Problem ist, das ich die Checkboxen im Control nur für das ganze Control aktiveren/deaktivieren kann.
Check/Uncheck ist mir schon klar.
Ich will die Checkboxen einzelnen Nodes zuweisen.
Nicht dem ganzen Control! | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Seek1 | Datum: 16.12.16 09:12 |
| Habe jetzt folgende Seite gefunden:
http://dotnetfollower.com/wordpress/2011/05/winforms-treeview-hide-checkbox-of-treenode/
Habe nun folgendes Modul erstellt:
Imports System.Runtime.InteropServices
Module mdlWinAPI
Private i As Integer = 0
Private j As Integer = 0
Private node As TreeNode()
Public Const TVIF_STATE As Integer = &H8
Public Const TVIS_STATEIMAGEMASK As Integer = &HF000
Public Const TV_FIRST As Integer = &H1100
Public Const TVM_SETITEM As Integer = TV_FIRST + 63
Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
Public Structure TVITEM
Public mask As Integer
Public hItem As IntPtr
Public state As Integer
Public stateMask As Integer
Public lpszText As [String]
Public cchTextMax As Integer
Public iImage As Integer
Public iSelectedImage As Integer
Public cChildren As Integer
Public lParam As IntPtr
End Structure
Public Sub HideCheckBox(ByVal node As TreeNode)
Dim tvi As New TVITEM()
tvi.hItem = node.Handle
tvi.mask = TVIF_STATE
tvi.stateMask = TVIS_STATEIMAGEMASK
tvi.state = 0
Dim lparam As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(tvi))
Marshal.StructureToPtr(tvi, lparam, False)
SendMessage(frmMain.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam)
End Sub
End Module Leider funktioniert es im VS nicht
Aufruf:
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
TreeView.Nodes.Add("Software")
TreeView.Nodes(0).Nodes.Add("Windows XP")
TreeView.Nodes(0).Nodes(0).Nodes.Add("Benutzer automatisch anmelden")
TreeView.Nodes.Add("Hardware")
TreeView.Nodes.Add("Trinksprüche")
TreeView.Nodes.Add("Wo ist die Toilette")
TreeView.SelectedNode = TreeView.Nodes(0)
HideCheckBox(TreeView.Nodes(0))
End Sub Jemand eine Idee? | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Manfred X | Datum: 16.12.16 21:48 |
| Hallo!
Der Hinweis, den ich gegeben habe, erläutert kurz,
wie man jeden einzelnen TreeView-Knoten selbst
(nach eigenem Belieben) zeichnen kann.
Es ist kein Problem, bei den entsprechenden Nodes
vor dem Zeichnen des Node-Text bei Bedarf ein Kästchen oder
einen Kreis zu platzieren und ggf. einen Haken oder ein
Kreuz.
Muß ich ein Code-Beispiel liefern ? | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Seek1 | Datum: 19.12.16 13:12 |
| Ja, das währe ein Hit | |
Re: [Treeview] Einzelne Nodes als "checkable" markieren | | | Autor: Manfred X | Datum: 19.12.16 13:54 |
| Hallo!
Ein klassenloses Beispiel, ausbaufähig.
Der Einfachheit halber wird der Check-Zustand jeweils
in der Tag-Eigenschaft der Nodes verwaltet.
Public Class frmTreeNodeCheck
Dim WithEvents trv As New TreeView _
With {.Parent = Me, .Width = 200, .Height = 200}
Dim checked As String = "checked"
Dim unchecked As String = "unchecked"
Private Sub frmTreeNodeCheck_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
trv.DrawMode = TreeViewDrawMode.OwnerDrawText 'Owner draws Node
'Some Nodes
Dim tn As TreeNode = trv.Nodes.Add("Node A")
tn.Nodes.Add("Node A1")
tn.Nodes.Add("Node A2").Tag = unchecked 'checkable Node
tn = trv.Nodes.Add("Node B")
tn.Nodes.Add("Node B1")
tn.Nodes.Add("Node B2").Tag = unchecked 'checkable Node
End Sub
Private Sub trv_DrawNode(sender As Object, _
e As System.Windows.Forms.DrawTreeNodeEventArgs) Handles trv.DrawNode
If e.Node.Tag Is Nothing Then
e.DrawDefault = True 'System draws Node; it's uncheckable
Else
e.Graphics.FillRectangle _
(New SolidBrush(trv.BackColor), e.Bounds)
With e.Bounds
Using p As New Pen(trv.ForeColor),
br As New SolidBrush(trv.ForeColor)
'Circle to Check
Dim r As New Rectangle(.Location, _
New Size(.Height - 4, .Height - 4))
If DirectCast(e.Node.Tag, String) = checked Then
'Node is checked
e.Graphics.FillEllipse(br, r)
Else
e.Graphics.DrawEllipse(p, r)
End If
e.Graphics.DrawString(e.Node.Text, trv.Font, _
br, New Point(.X + 4 + .Height, .Y + 2))
End Using
End With
End If
End Sub
Private Sub trv_MouseDown(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) Handles trv.MouseDown
Dim hti As TreeViewHitTestInfo = trv.HitTest(e.Location)
With hti
If .Node Is Nothing Then Exit Sub 'No Node available
If .Node.Tag Is Nothing Then Exit Sub 'uncheckable Node
If DirectCast(.Node.Tag, String) = checked Then
.Node.Tag = unchecked
Else
.Node.Tag = checked
End If
trv.Invalidate(.Node.Bounds)
End With
End Sub
End Class | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|