28 juillet 2009

InfoPath : Le retour de l'attribut nil

Tôt ou tard, en réalisant du code managé sur infopath, vous allez être confronté à l'erreur qui tue "schema validation found non-data type"...

Cette erreur provient dans 99% des cas de l'attribut nil sur les champs de type "DateTime, Time, Date, Boolean, Whole Number et Decimal".
Si vous rendez un de ces champs null, vous aurez l'erreur précédente car le vide est considéré comme une chaine vide et donc le formatage des données n'est pas respecté...

La méthode de contournement est simple, encore faut-il la connaitre!
Il suffit d'utiliser ces 2 procédures codées en C# qui prennent en paramètre un XPathNavigator du noeud concerné.

La procédure "DeleteNil" permet d'enlever l'attribut nil du noeud s'il existe de manière à insérer une valeur dans le champ sans avoir d'erreur.

public void DeleteNil(XPathNavigator node)
{
if (node.MoveToAttribute("nil",
http://www.w3.org/2001/XMLSchema-instance))
node.DeleteSelf();
}


La procédure "InsertNil", quand à elle, permet de supprimer la valeur d'un champ qui n'est pas de type texte.Pour cela il faut supprimer la valeur et remettre l'attribur nil:

public static void InsertNil(XPathNavigator node)
{
if(!node.MoveToAttribute("nil", "
http://www.w3.org/2001/XMLSchema-instance"))
{
string result = string.Empty;
int endIndex = node.OuterXml.IndexOf(">");
result = node.OuterXml.Substring(0, endIndex) + " xsi:nil=\"true\" />";
node.OuterXml = result;
}
}


Et voila, vous voila débarassé du cauchemar du "schema validation found non-data type".
Il suffit à présent d'appeler la bonne prodédure.

3 commentaires:

  1. et sur quel event tu arrives à remettre l'attribut nil ?
    je n'ai réussi ni sur le beforeChange, ni sur le validate de mon Date picker

    RépondreSupprimer
  2. Perso je le fais fonctionner sur l'évènement "OnAfterChange".

    Cordialement.

    RépondreSupprimer
  3. Bonjour je vais paraitre stupide mais ce sont mes débuts sur le développement InfoPath et je ne maitrise pas grand chose. J'ai crée la procédure DeleteNil et quand je fait :
    XPathNavigator nav = MainDataSource.CreateNavigator();
    XPathNavigator myDate = nav.SelectSingleNode("//my:NewjoueurDatedenaissance", NamespaceManager);
    DeleteNil(myDate);
    myDate.SetValue(string.Empty);

    dans un OnClick cela ne fonctionne pas... d'où peux provenir mon erreur ? je cherche à vider un champ date dans un IP web form. Merci d'avance.

    RépondreSupprimer