Que se cache-t-il derrière la propriété Value de la classe NumericUpDown
Bonjour,
Dans un formulaire, j'ai un contrôle de type NumericUpDown et un contrôle personnalisé de type StarRate (équivalent à un NumUpDown mais affiche des étoiles de 1 à 5 pour attribuer une note)
Je suis toujours en train de fiabiliser ce contrôle personnalisé que j'évoquais ici
Mon StarRate a une property Value qui doit fonctionner comme le NumericUpDown (NUD).
Voici le code de cette property :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Public Property Value() As Integer
Get
Return StarValue
End Get
Set(ByVal value As Integer)
If value > StarCount Then
StarValue = StarCount
Else
StarValue = value
End If
Me.Refresh()
End Set
End Property |
(Il y a bien sûr une sub OnPaint qui décrit comment colorier les étoiles en fonction de value).
Mon formulaire est en fait lié à une table. Je passe d'un enregistrement à l'autre à l'aide d'un BindingNavigator qui contient aussi un bouton AddNew (natif dans le BindingNavigator)
En cliquant sur ce bouton AddNew, les champs du formulaire doivent s'effacer pour permettre la saisie d'un nouvel enregistrement par l'utilisateur.
Il se trouve que ce bouton AddNew a, par construction de VB.NET, la gentillesse de simuler l'équivalent d'un bindingsource.addnew quand on clique dessus (j'ai découvert cela par hasard).
En revanche, il faut effacer les champs par le code.
Ce qui donne :
Code:
1 2 3 4 5 6
| Private Sub AjouterEnregistrement(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddNewItem.Click
NumericUpDown1.Value = 0 ' pour mon NUD
Textbox1.Clear() ' pour un champ de type textbox ; on peut aussi faire TextBox1.text = Nothing
StarRate1.Value = 0
...
End Sub |
A la ligne 4, le champ StarRate est bien mis à zéro, si l'enregistrement affiché comportait une valeur non nulle, mais sitôt le End Sub passé, ce champ reprend la valeur d'avant.
J'ai remarqué que ce n'est pas le cas du NUD qui reste bien à 0 après le End Sub
J'ai remarqué que je peux résoudre le pb en ajoutant après la ligne 4 :
Code:
StarRate1.DataBindings.Clear()
Mais ce n'est pas très élégant, car cela m'oblige à restaurer explicitement le DataBinding pour ce champ si je clique sur le bouton Cancel du bindingnavigator alors que, pour les autres champs, un simple Bindingsource.CancelEdit règle la question (c'est-à-dire suffit à restaurer les valeurs des champs avant le clique sur AddNew)
J'en déduis que le code de ma property est incomplet.
Mon idée est de m'inspirer de la property Value du NUD qui, lui, se comporte bien comme attendu.
En résumé, quelqu'un pourrait-il m'aider à trouver le code source complet de la propriété Value de la classe NumericUpDown ou (plus difficile), me dire ce qui manque dans le code de ma propriété pour que mon contrôle personnalisé se comporte comme le NUD face à un ajout d'enregistrement (et son annulation) lorsque le contrôle est lié à un DataBinding ?