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

Windows Presentation Foundation Discussion :

Validation de ma saisie avec ExceptionValidationRule


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut Validation de ma saisie avec ExceptionValidationRule
    Bonjour à tous,

    J'ai développé une petite application en WPF.
    Cette application permet de créer des évènements.
    J'ai donc une fenetre de saisie qui contient un DataGrid avec tous les évènements crées, et, en dessous de ce tableau des textboxs afin d'afficher les détails de l'évènement sur lequel est postionné l'utilisateur.

    J'ai implémenté avec le binding la validation de la saisie. Ainsi, lorsqu'une donnée saisie par l'utilisateur est invalide, un libellé s'affiche à côté de mon textBoxs afin d'avertir l'utilisateur que la saisie est incorrect.

    Mon problème est très simple :

    Je possède plusieurs textboxs pour lesquelles la validation va tester l'existance de la donnée dans une table.

    Exemple : Je possède une textbox client. Si je saisie un code client, le binding va aller vérifier dans la table "Client" si le client existe.
    Si la donnée saisie n'existe pas, la validation n'est pas ok, et l'utilisateur est avertis de cette erreur.

    En saisie, le mécanisme fonctionne très bien

    Seulement voilà, je vais dans ma base de donnée, et supprime mon client dans la table Client. Lors de la prochaine entrée dans mon programme, le chargement des évènements va invoquer le binding, et là, la validation va aller vérifier que le code client existe dans ta table Client.

    Le comportement "normal" voudrait que mon programme affiche un libellé a côté du textbox "client" disant que le client n'existe pas, or, au lieu de cela, la validation arrête le chargement des évènements, mon datagrid devient donc vide.

    Je vois donc d'où vient le problème, mais je ne comprends pas ce comportement.

    Un peu de code


    Voici le code XAML de la définition de mon TextBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <TextBox Name="TextBox_CodeClient" TabIndex="1" Grid.Column="1" VerticalAlignment="Center" Height="20">
    	<TextBox.Text>
    		<Binding Path="strCodeClient" >
    			<Binding.ValidationRules>
    				<ExceptionValidationRule />
    			</Binding.ValidationRules>
    		</Binding>
    	</TextBox.Text>
    </TextBox>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel LastChildFill="True">
                        <TextBlock Margin="50,0,0,0" DockPanel.Dock="Right"
                        Foreground="Red"
                        FontSize="10pt"
                        Text="{Binding ElementName=MyAdorner,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                        </TextBlock>
                        <Border BorderBrush="Red" BorderThickness="1">
                            <AdornedElementPlaceholder Name="MyAdorner" />
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    Voici maintenant le binding, la variable strCodeClient fait partie de ma classe Evenement. Cette donc cette variable qui est liée au TexteBox code client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public string strCodeClient
    {
    	get { return m_strCodeClient; }
    	set {
    			m_strCodeClient = value;
    			if (m_strCodeClient.Trim() != "")
    			{
    				if (m_objEvtCode.ReadClientbyCode(m_strCodeClient) != 0)
    				{
    					throw new ApplicationException(m_strCodeClient.Trim() + " est inexistant !");
    				}
    				FirePropertyChangedEvent("strCodeClient");
    			}
    			else
    			{
    				objEvtCode.strNom = "";
    				objEvtCode.strCode = "";
    			}
     
    			FirePropertyChangedEvent("objEvtCode.strNom");
     
    		}
    }
    Dans mon Windows_Load, mon programme va simplement aller lire TOUS les évènements en les stockants dans une ObservableListe d'objets évènements.

    Lors de ce chargement, le code client est vérifié, et si il n'existe pas, au lieu d'affiche un message d'erreur, lorsque le programme passe sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new ApplicationException(m_strCodeClient.Trim() + " est inexistant !");
    la procédure chargeant tous les évènements se quitte, et le datagrid est vide

    Une chose qui me parait très importante à préciser : Si je déplace ma fonction de chargement des évènements de Windows_Load vers la fonction Initialized(), l'exception de validation qui va détecter mon code client innexistant va planter mon applis ! L'exception ne sera pas gérer et elle sera affichée à l'écran avec le messageBox standard , au lieu d'afficher le libellé d'erreure comme cela devrait le faire. Interessant non cette différence ? C'est comme si dans ce cas, au démarrage de l'appli, l'exception n'était pas gérée.

    J'éspère avoir été assez clair et détaillé dans mon message, j'éspère que quelqu'un pourra m'aider

    Merci à tous

    Bien cordialement,

    Nixeus

  2. #2
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Bonjour,

    Je pense que tu va devoir te taper l’implémentation de IDataError.
    Un article très intéressant pour t'aider à mieux comprendre les mécanismes de validations :

    http://labs.bewise.fr/Article/Les-mo...-WinRT-Metro-/

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/04/2013, 11h13
  2. Réponses: 4
    Dernier message: 22/01/2011, 16h23
  3. validation champ saisie avec jquery
    Par Miss kouka dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2010, 16h26
  4. Validation d'une saisie avec DBNavigator
    Par nanar1 dans le forum Bases de données
    Réponses: 5
    Dernier message: 25/11/2008, 15h52
  5. [WD9] Validation d'un champ de saisie avec touche entrée
    Par EpOnYmE187 dans le forum WinDev
    Réponses: 11
    Dernier message: 13/01/2006, 15h28

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