Intercepter une exception dans l’évènement ColumnChanging

Signaler
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013
-
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013
-
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


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

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.

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

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

As-tu utilisé BeginEdit et EndEdit comme montré ici ?
Lis aussi tout l'article (en anglais mais très explicite).
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

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.