Intercepter une exception dans l’évènement ColumnChanging
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013
-
13 juin 2012 à 20:40
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013
-
16 juin 2012 à 10:45
Bonjour à tous,
Suite à de grosses difficultés qui sont restés sans réponse sur un autre forum j'ai décidé de repartir à zéro et revoir complètement une procédure de validation de données conformément à ce qui est recommandé dans msdn (voir le lien ci-dessous), j'ai également trouvé un bout de code sur un livre très sérieux que je recommande au passage "Manuel de référence Visual Basic.NET"
Il est dit dans Msdn qu'il suffit de lever une exception pour annuler une modification de données avant même qu'elle ne soit écrite dans la base. Oui mais d'habitude je sais intercepter une exception dans la procédure appelante à l'aide d'un bloc/Try Catch, pour gérer l'erreur et ne pas planter le programme bêtement mais dans ce cas il n'y a pas de procédure appelante puisque l’exception est levée à l’intérieur d'un évènement. Comment procéder dans ce cas et je voudrais m'assurer que cette exception à bien pour effet d'annuler mes modifications, chose que je n'ai pas pu vérifier pour les raisons que j'ai expliqué précédemment.
Private Sub EventTableColumnChanging(sender As System.Object, e As System.Data.DataColumnChangeEventArgs)
If (e.Column.ColumnName = "MaColonne") Then
If CType(e.ProposedValue, String) = "ValeurValide" Then
e.Row.SetColumnError(e.Column, "")
Else
e.Row.SetColumnError(e.Column, "La valeur n'est pas valide")
Throw New ArgumentException("La valeur n'est pas valide")
End If
End If
End Sub
Puisqu'il est écrit pour l'événement ColumnChanging :
Les mises à jour étant effectuées pendant ces événements, vous pouvez annuler la mise à jour en levant une exception, ce qui interrompt les modifications.
Tu dois gérer l'exception comme d'habitude dans l'événement :
try
throw new exception("blabla")
catch ex as exception
'...
end try
Dans ce cas, l'événement ColumnChanged ne détectera aucune modification ce qui veut dire que l'opération a bien été annulée.
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013 14 juin 2012 à 19:05
Merci de m'avoir répondu banana32, mais ça ne fonctionne pas.
le code exécute bien la commande Throw avec ou sans le bloc Try/Catch mais la modification n'est pas annulé. La différence c'est qu'avec le bloc Try/Catch le code continue son exécution et la fenêtre d'erreur ne s'affiche pas.
J'ai du rater quelque chose que je ne comprends vraiment pas.
Private Sub EventTableColumnChanging(sender As System.Object, e As System.Data.DataColumnChangeEventArgs)
If (e.Column.ColumnName = "MaColonne") Then
If CType(e.ProposedValue, String) = "ValeurValide" Then
e.Row.SetColumnError(e.Column, "")
Else
e.Row.CancelEdit()
End If
End If
End Sub
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013 15 juin 2012 à 19:40
Bonsoir et merci de me répondre,
CancelEdit n'a aucun effet dans l'évènement ColumnChanging. J'ai l'impression que malgré ce qui est dit sur Msdn, il n'y a aucun moyen d'annuler une modification dans ColumnChaching (Est ce un bug du FrameWork ?).
je suis sur une autre piste qui consiste à écraser la valeur Proposed de cette façon :
e.ProposedValue = e.Row(e.Column.ColumnName)
je n'ai pas encore récrit toute ma procédure de calcul et de validation de cette façon donc je ne peux pas encore confirmer que je n'aurais pas d'effet secondaire mais c'est la seule possibilité que j'ai trouvé pour l'instant.
Avant cela j'étais sur une autre piste qui consiste à faire un CancelEdit dans l’évènement ColumnChanged et là ça fonctionne sauf que mes contrôles qui sont DataBindés sur ces colonnes ne sont pas annulés eux. ça n'ai pas gênant lors d'un premier passage dans ColomnChanged mais lors d'un deuxieme passage je retrouve ma valeur annulé dans la ligne e.row("ColonneQuiàétaitAnnulé"). En clair la valeur pourrait être définitivement annulé avec cette méthode si je n'avais pas contôles DataBindés (Je crois). Et j'ai l'impression que le moteur de Binding qui est censé rafraîchir toutes les liaisons de données ne fait rien tant que l’évènement ColumnChanging n'a pas terminé son exécution.
NOTA : Pour rafraîchir le contrôle je ne souhaite pas agir directement sur celui-ci (avec MonControle.Refresh par exemple). Mon programme doit pouvoir intercepter n'importe quelle modification sans savoir si elle provient ou d'un contrôle simple ou encore d'un DataGridView.
Si vous avez des idées je suis prêt à tout essayer, ça fait au moins 2 mois que je suis bloqué sur ce point particulier
Vous n’avez pas trouvé la réponse que vous recherchez ?
BasicZx81
Messages postés140Date d'inscriptionsamedi 5 mars 2011StatutMembreDernière intervention13 août 2013 16 juin 2012 à 10:45
Bonjour banana32, j'ai essayé ça aussi mais j'avais aussi quelques problèmes d'annulation. Je pense que c'est à cause des contrôles DataBindés qui ne peuvent pas être annulés dans l’évènement ColumnChanging ou ColumnChanged et j'ai l'impression que le moteur de DataBinding n'envoie pas de notification aux contrôles pendant l’exécution des évènements que j'ai cités.
Pour tout dire j'ai pensé à exécuter ma procédure que se charge des calculs et de l'annulation dans un Threads secondaire mais j'ai pas encore essayé. Je trouve quand même très étonnant de rencontrer ce genre de problème alors que le DataBinding devrait tout se charger de faire tout ça.