Intercepter une exception dans l’évènement ColumnChanging

BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013 - 13 juin 2012 à 20:40
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 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"

Tapez le texte de l'url ici.

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


Merci beaucoup si vous pouvez m'aider.

6 réponses

Utilisateur anonyme
13 juin 2012 à 23:31
Bonsoir,

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.
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 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.

Merci beaucoup si vous avez une idée du problème.
0
Utilisateur anonyme
15 juin 2012 à 16:27
As-tu essayé avec la méthode CancelEdit ?
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
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
16 juin 2012 à 06:58
As-tu utilisé BeginEdit et EndEdit comme montré ici ?
Lis aussi tout l'article (en anglais mais très explicite).
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 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.
0
Rejoignez-nous