vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ....
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: [Treeview] Einzelne Nodes als "checkable" markieren 
Autor: Seek1
Datum: 19.12.16 13:12

Ja, das währe ein Hit
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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