none
UserControl avec une propriété List <Of T> RRS feed

  • Question

  • Bonjour,

    J'ai un Usercontrol "Knob" dont une propriété est une collection (List (Of T)) de classe "Rangefills".

    Quand j'exécute le programme, je peux dans la grille de l'éditeur de collection modifier les propriétés

    de ma classe RangeFills et ajouter la classe dans ma collection.

    Le contenu de ma collection est bien visible dans ma variable privée m_RangeFills de mon Usercontrol.

    Mon problème est que le programme n’accède pas dans la partie Set - End Set de la déclaration de ma propriété

    "RangeFills" de mon UserControl alors que la variable privée est bien affectée.

    Dans ce bloc Set - End Set, je veux introduire l'instruction Me.Invalidate afin d'exécuter l'événement Paint

    de mon UserControl.

    Comment déclencher cet événement après la mise à jour des propriétés des classes de la collection?

    Merci


    samedi 25 février 2017 05:33

Réponses

  • Bonjour,

    Voici ma solution pour le problème décrit.

    Dans ma classe principale Knob :

    • Rempacer la collection List(Of) par une collection BindingList(Of) qui offre l'événement ListChanged
    • Lier l'événement ListChanged à une procédure
    • Dans cette procédure ajouter la méthode Me.Invalidate

     Maintenant à chaque ajout ou suppression d'une classe de ma collection le contrôle sera redessiné. 

    Il reste à implémenter un événement pour la modification de la valeur de chaque propriété de la classe RangeFills

    Dans la classe RangeFills :

    • Implémenter l'interface INotifyPropertyChanged
    • Déclarer un événement liée à la méthode pour gérer la modification de la propriété
    • Pour chaque propriété, déclencher l'événement

    Voila c'est terminé.

    Imports System.ComponentModel
    Imports System.Drawing
    
    <ToolboxBitmap(GetType(Knob), "Knob.bmp")>
    Public Class Knob
    
    #Region "Propriétés"
    
        <DefaultValue(0), Category("Knob"), Description("Valeur de la position de l'affichage.")>
        Public Property ValueKnob As Single
            Get
                Return m_ValueKnob
            End Get
            Set(ByVal Value As Single)
                m_ValueKnob = Value
                Me.Invalidate()
            End Set
        End Property
    
        <Category("RangeFills"), Description("Liste des zones de couleur.")>
        <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
        Public Property RangeFills As BindingList(Of RangeFills)
            Get
                Return m_RangeFills
            End Get
            Set(value As BindingList(Of RangeFills))
                m_RangeFills = value
            End Set
        End Property
    
    #End Region
    
        Dim m_ValueKnob As Single = 0
        Dim m_RangeFills As New BindingList(Of RangeFills)
    
        Private Sub Knob_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'Se lie à l'événement
            AddHandler m_RangeFills.ListChanged, AddressOf RangeFills_CollectionChange
        End Sub
    
        Private Sub RangeFills_CollectionChange(sender As Object, e As ListChangedEventArgs)
            'Redessine le controle
            Me.Invalidate()
        End Sub
    
    End Class
    
    '---------------------------------------------------------
    
    Imports System.ComponentModel
    Imports System.Drawing
    
    Public Class RangeFills
        Implements INotifyPropertyChanged
    
    #Region "Propriétés"
    
        Public Sub New()
            m_RangeColor = Color.Red
            m_MinRange = 10
    
        End Sub
    
        Public Property RangeColor As Color
            Get
                Return m_RangeColor
            End Get
            Set(ByVal Value As Color)
                m_RangeColor = Value
    
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("RangeFills"))
            End Set
        End Property
    
        Public Property MinRange As Single
            Get
                Return m_MinRange
            End Get
            Set(ByVal Value As Single)
                m_MinRange = Value
    
                'Génére l'événement sur le changement de la valeur de la propriété
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("RangeFills"))
            End Set
        End Property
    
    #End Region
    
        Dim m_RangeColor As Color
        Dim m_MinRange As Single
    
        'Declare l'événement sur le changement de la valeur de la propriété
        Private Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    End Class



    dimanche 5 mars 2017 06:38

Toutes les réponses

  • Sans voir votre code il est difficile de suggèrer une mèthode particulière.

    Regardez dans ce msdn pour les Paint events d'un UserControl: https://msdn.microsoft.com/en-us/library/b818z6z6(v=vs.110).aspx

    Lorsque vous aurez modifier le Paint event, si vous avez des problèmes postez le code et on pourra vous aider.


    Ensuite dans les Set event, ajouter un Invalidate pour déclencher le Paint event si la Form de base ne le déclenche pas elle même.
    samedi 25 février 2017 13:31
  • Voici le code de mon UserControl extrait et simplifié pour essai.

    Imports System.ComponentModel

    Imports System.Collections.Generic Public Class Knob #Region "Propriétés" Public Property ValueKnob As Single Get Return m_ValueKnob End Get Set(ByVal Value As Single) m_ValueKnob = Value

    Me.Invalidate End Set End Property <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> Public Property RangeFills As List(Of RangeFills) Get Return m_RangeFills End Get Set(ByVal Value As List(Of RangeFills)) m_RangeFills = Value

    Me.Invalidate

    End Set End Property #End Region Dim m_ValueKnob As Single = 0 Dim m_RangeFills As New List(Of RangeFills)() End Class -------------------------------------------- Imports System.Drawing Public Class RangeFills #Region "Propriétés" Public Property RangeColor As Color Get Return m_RangeColor End Get Set(ByVal Value As Color) m_RangeColor = Value End Set End Property Public Property MinRange As Single Get Return m_MinRange End Get Set(ByVal Value As Single) m_MinRange = Value End Set End Property #End Region Dim m_RangeColor As Color Dim m_MinRange As Single End Class





    lundi 27 février 2017 19:36
  • Bonjour,

    Voici ma solution pour le problème décrit.

    Dans ma classe principale Knob :

    • Rempacer la collection List(Of) par une collection BindingList(Of) qui offre l'événement ListChanged
    • Lier l'événement ListChanged à une procédure
    • Dans cette procédure ajouter la méthode Me.Invalidate

     Maintenant à chaque ajout ou suppression d'une classe de ma collection le contrôle sera redessiné. 

    Il reste à implémenter un événement pour la modification de la valeur de chaque propriété de la classe RangeFills

    Dans la classe RangeFills :

    • Implémenter l'interface INotifyPropertyChanged
    • Déclarer un événement liée à la méthode pour gérer la modification de la propriété
    • Pour chaque propriété, déclencher l'événement

    Voila c'est terminé.

    Imports System.ComponentModel
    Imports System.Drawing
    
    <ToolboxBitmap(GetType(Knob), "Knob.bmp")>
    Public Class Knob
    
    #Region "Propriétés"
    
        <DefaultValue(0), Category("Knob"), Description("Valeur de la position de l'affichage.")>
        Public Property ValueKnob As Single
            Get
                Return m_ValueKnob
            End Get
            Set(ByVal Value As Single)
                m_ValueKnob = Value
                Me.Invalidate()
            End Set
        End Property
    
        <Category("RangeFills"), Description("Liste des zones de couleur.")>
        <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
        Public Property RangeFills As BindingList(Of RangeFills)
            Get
                Return m_RangeFills
            End Get
            Set(value As BindingList(Of RangeFills))
                m_RangeFills = value
            End Set
        End Property
    
    #End Region
    
        Dim m_ValueKnob As Single = 0
        Dim m_RangeFills As New BindingList(Of RangeFills)
    
        Private Sub Knob_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'Se lie à l'événement
            AddHandler m_RangeFills.ListChanged, AddressOf RangeFills_CollectionChange
        End Sub
    
        Private Sub RangeFills_CollectionChange(sender As Object, e As ListChangedEventArgs)
            'Redessine le controle
            Me.Invalidate()
        End Sub
    
    End Class
    
    '---------------------------------------------------------
    
    Imports System.ComponentModel
    Imports System.Drawing
    
    Public Class RangeFills
        Implements INotifyPropertyChanged
    
    #Region "Propriétés"
    
        Public Sub New()
            m_RangeColor = Color.Red
            m_MinRange = 10
    
        End Sub
    
        Public Property RangeColor As Color
            Get
                Return m_RangeColor
            End Get
            Set(ByVal Value As Color)
                m_RangeColor = Value
    
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("RangeFills"))
            End Set
        End Property
    
        Public Property MinRange As Single
            Get
                Return m_MinRange
            End Get
            Set(ByVal Value As Single)
                m_MinRange = Value
    
                'Génére l'événement sur le changement de la valeur de la propriété
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("RangeFills"))
            End Set
        End Property
    
    #End Region
    
        Dim m_RangeColor As Color
        Dim m_MinRange As Single
    
        'Declare l'événement sur le changement de la valeur de la propriété
        Private Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    End Class



    dimanche 5 mars 2017 06:38