none
Validation de ma saisie avec ExceptionValidationRule RRS feed

  • Question

  • 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'existence 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

    <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>
    <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

     
    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

    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


    • Modifié Nixeus mercredi 17 avril 2013 07:18
    mardi 16 avril 2013 12:08