IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Que se cache-t-il derrière la propriété Value de la classe NumericUpDown


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    774
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 774
    Points : 275
    Points
    275
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Pour le code source c'est pas difficile maintenant que celui-ci est consultable voir ici

    Pour ce qui est du reste, à voir si l'attribut Bindable présent sur NumericUpDown.Value ou la levée de l'évènement ValueChanged ont une incidence
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    774
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 774
    Points : 275
    Points
    275
    Par défaut
    Merci pour ce lien dont j'ignorais l'existence.
    Cela répond parfaitement à la question posée dans le sujet de ce topic.
    Je solde donc la question.

    Toutefois, je n'ai pas bien réussi à décrypter le code sous-jacent. J'ai essayé de m'en inspirer mais sans succès.

    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.
    Pour ce qui concerne ce pb, j'ai fait un test sur un projet VB simplifié et je n'arrive pas à reproduire le pb. je ne suis donc pas certain que le pb vienne du code de mon contrôle personnalisé. Je penche plutôt sur un pb propre au code de mon appli.
    J'ai un peu de mal à pister ce que fait le code après l'event sub AddNew.Click car le débogage pas à pas boucle sur des Event de type CellFormatting et/ou GotFocus. Or si pb il y a , je pense que c'est plus loin dans l'exécution du code.

    Merci en tout cas de ton aide. Je reviendrai avec une question plus précise si j'arrive à cerner davantage mon pb, mais pour l'instant, je ne pense pas que qqun puisse m'aider dans ce forum au vu des éléments évoqués.

  4. #4
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Pour le code source c'est pas difficile maintenant que celui-ci est consultable voir ici

    Merci aussi pour ce lien dont j'ignorais l'existence ! Enfin des réponses à mes questions sur les choix de Windows ... !
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est en parti pour ça que je ne poste plus de question sur le forum depuis un moment

    J'ai appris pas mal de truc en regardant les sources notamment la programmation par contrat et d'autres concept peu connu.


    Toutefois, il est fort dommage que les Modérateurs des Forum du .NET (C#, VB et autres) n'est posté un tel lien en haut de chaque forum.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    Citation Envoyé par Sehnsucht Voir le message
    Pour le code source c'est pas difficile maintenant que celui-ci est consultable voir ici
    Merci pour le lien que le ne connaissais pas. Pour cela, tu "mérites" un

    Dire que je me pensais un grand expert de la recherche sur MSDN.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    774
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 774
    Points : 275
    Points
    275
    Par défaut
    Pour résoudre le problème que j'évoquais plus haut, j'ai trouvé une solution sans pour autant être capable d'expliquer pourquoi elle résout le pb.

    J'ai mis la propriété BindingNavigator.AddNewItem à None dans le designer alors que, jusqu'ici, sa valeur était le nom du bouton AddNew.
    En contrepartie, il faut que je rajouter l'instruction BindingSource.addNew en début de l'Event click du bouton AddNew.
    En revanche, cette dernière instruction rend les instructions de type TextBox.clear inutiles
    Mais il faut que je garde l'instruction StarRate.Value = 0

    Dans ces conditions, un clic sur AddNew prépare le bindingsource pour l'ajout d'un enregistrement et met à 0 tous les champs, y compris les StarRate.

    L'important est que je n'ai pas besoin de faire un DataBindings.Clear sur le StarRate pour que la valeur 0 soit bien prise en compte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/08/2007, 15h23
  2. commnet veriffier que le cache est bien mis en place
    Par iftolotfi dans le forum Hibernate
    Réponses: 6
    Dernier message: 01/06/2007, 14h51
  3. initialiser propriété value dans champ input
    Par dubitoph dans le forum Langage
    Réponses: 15
    Dernier message: 21/03/2006, 13h01
  4. Qu'est ce que le cache ?
    Par irrou dans le forum Assembleur
    Réponses: 4
    Dernier message: 24/11/2002, 23h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo