Salut,
Voilà pas mal de temps que je cherche sur le RowChanging, RowChanged, ColumnChanging et ColumnChanged.
Mes sources principales d'inspiration :
http://msdn.microsoft.com/fr-fr/libr...sb(VS.80).aspx
http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx
http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx
et pages connexes.
Malgré tout cela, certaines choses m'échappent et je me trouve bloqué.
Soit un DataSet typé contenant la table "Lignes" qui contient les colonnes "NumeroPoint1", "NumeroPoint2" et "Centre" et "Rayon".
La table est liée à un datagridview via un bindingsource (méthode classique avec les DataSet typés).
Vu que la partie DataSet (le XSD) doit être réutilisée dans d'autres appli futures, je me suis dis qu'il serait bien d'y intégrer les validations, ce qui me permettrait d'importer le XSD dans les autres applis et de ne pas devoir refaire les validations.
À la lecture des colonnes de la table vous vous doutez que la présence de "NumeroPoint1" et "NumeroPoint2" est indispensable.
Ensuite, si "Centre" n'est pas null (c'est qu'on est en présence d'un arc), on calcule le rayon.
J'ai donc créé un ColumnChanging pour valider que "NumeroPoint1" et "NumeroPoint2" ne sont pas vides, et par la même occasion, pour vérifier que la valeur que l'utilisateur a écrite existe bien dans la table "Points". Si une erreur est levée, comme dans les exemples, je crées par exemple la ligne suivante :
e.Row.SetColumnError("NumeroPoint1", "Ce point n'existe pas");
Cela fonctionne bien et l'icone d'erreur s'affiche. Par contre la valeur est bel et bien envoyée à la DataTable, ce qui créera inévitablement des problèmes puisque le point n'existant pas dans la table "Points", on ne pourra pas en extraire les coordonnées et les calculs suivants s'en trouveront passablement plantés.
Je pensais aussi, mais à tort je crois, qu'on n'atteindrait pas le RowChanging tant que tous les ColumnChanging n'auraient été passé positivement.
Je voulais donc y vérifier que, si "Centre" n'est pas vide, la distance entre le centre et le Point1 soit la même qu'entre le centre et le point2, sinon une autre erreur doit être levée et la DataTable ne dois pas être mise à jour.
L'erreur est bien levée, mais ici encore, la DataTable est mise à jour avec les données erronées. Et si on avait laissé un point vide (ou écrit un point inexistant) dans l'une ou les 2 colonnes de points, le calcul de distance lève son erreur de valeur nulle.
J'ai pensé à e.Row.AcceptChanges(); et à e.Row.RejectChanges(); mais à ce que l'ai compris e.Row.AcceptChanges(); remet le RowState à Unchanged, ce qui veut dire que je perdrais les valeurs Original de la ligne pour la vérification de l'accès concurrentiel à l'update du DataSet.
De même, le e.Row.RejectChanges(); remet les valeurs de la row à leurs valeurs d'origine, ce qui sous entend que si l'utilisateur avait changé les points mais qu'il se serait trompé de ligne en mettant le centre (si si, ça arrive.
), comme le centre ne serait pas à la même distance des 2 nouveaux points, le centre ET les points reprendraient leur valeur d'origine (qui avaient par ailleurs peut-être été modifiés auparavant et qui ne correspondaient déjà plus à la valeur d'origine.
Bref, comme vous voyez, je suis assez embêté je ne trouve pas l'issue à mon problème, or je suis sûr qu'il y en a une.
Serais-je vraiment contraint au cellvalidating et au rowvalidating du DataGridView (ce qui me ferait perdre pas mal en portablilité, me semble-t-il) ?
Ce serait dommage, mais si c'est le cas, j'aimerais que les savants du forum me le confirment, parce que, de mon point de vue, il me semble plus logique de faire la validation côté DataSet (mais je suis peut-être dans l'erreur).
Merci de vos z'avis z'avisés.
Partager