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