none
TreeNode Text Binding RRS feed

  • Frage

  • Hallo Leute,
    die Text-Eigenschaft eines Controls kann ich ja relativ einfach binden zB.:
    Label1.DataBindings.Add("Text", TextBox1, "Text")

    Hierbei zeigt ja das Label1 genau den Text an, der in der TextBox1 eingegeben wird.

    Nun möchte ich jedoch die Text-Eigenschaft eines selektierten TreeNodes innerhalb eines TreeViews an die Text-Eigenschaft einer TextBox binden.
    Der TreeNode unterstützt jedoch keine DataBindings.

    Wie kann ich hierbei vorgehen?

    Vielen Dank im Voraus
    Christian


    Christian Tauschek

    Sonntag, 17. Dezember 2017 14:37

Antworten

  • Hi Christian,
    zur Lösung des Problems kannst Du eine eigene TreeNode-Klasse ableiten und diese mit einer Eigenscjaft binden, die denInhalt der Text-Eigenschaft des ausgewählten Knotens nach außen reicht bzw. von außen übernimmt. Hier mal eine kleine Demo:

    Imports System.ComponentModel
    Imports System.Runtime.CompilerServices
    
    Public Class Form24
    
      Private WithEvents tv As New MyTreeView With {.Dock = DockStyle.Fill}
      Private tb As New TextBox With {.Dock = DockStyle.Bottom}
      Private rnd As New Random
      Private Sub Form24_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.Controls.AddRange(New Control() {tb, tv})
        tb.DataBindings.Add(NameOf(TextBox.Text), Me, NameOf(Info))
        tv.DataBindings.Add(NameOf(MyTreeView.SelectedNodeText), Me, NameOf(Info), False, DataSourceUpdateMode.OnPropertyChanged)
        LoadTreenodes(tv.Nodes, 1)
        tv.ExpandAll()
      End Sub
    
      Private Sub LoadTreenodes(tn As TreeNodeCollection, level As Integer)
        For i = 1 To rnd.Next(3, 8)
          Dim n As New TreeNode With {.Text = $"Node {level} {i}"}
          If 1 / level > rnd.NextDouble() Then LoadTreenodes(n.Nodes, level + 1)
          tn.Add(n)
        Next
      End Sub
    
      Public Property Info As String
    
      Public Class MyTreeView
        Inherits TreeView
        Implements INotifyPropertyChanged
    
        Sub New()
          MyBase.New
          AddHandler Me.AfterSelect, Sub()
                                       OnPropertyChanged(NameOf(SelectedNodeText))
                                     End Sub
        End Sub
        Public Property SelectedNodeText As String
          Get
            Return Me.SelectedNode.Text
          End Get
          Set(value As String)
            If Me.SelectedNode IsNot Nothing Then Me.SelectedNode.Text = value
          End Set
        End Property
    
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
        Friend Sub OnPropertyChanged(<CallerMemberName> Optional propname As String = "")
          RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propname))
        End Sub
      End Class
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 18. Dezember 2017 07:39