Meilleur auteur de réponses
UserControl avec une propriété List <Of T>

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
- Modifié Jacky Perpète samedi 25 février 2017 05:35
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
- Marqué comme réponse Jacky Perpète dimanche 5 mars 2017 06:40
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.- Modifié Cyrille Précetti samedi 25 février 2017 13:32
-
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
- Modifié Jacky Perpète lundi 27 février 2017 19:41
-
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
- Marqué comme réponse Jacky Perpète dimanche 5 mars 2017 06:40