lundi 8 septembre 2008

Remplir du texte riche en .NET

Comment remplir des boîtes de texte riche (RichTextBox) sous Infopath 2007 avec du code managé (.NET 3.0).

Je reprends mon exemple sur les sources de données secondaires en .NET : j'ai un commentaire (cette fois en texte riche : du code xhtml) que je veux afficher dans une boîte (de texte riche aussi).

Ici je ne peux pas utiliser la méthode SetValue, elle n'est pas faite pour ça. J'ai en revanche à ma disposition deux méthodes (AppendChild et PrependChild) et un attribut (InnerXml) intéressants. Voici donc le code permettant d'afficher mon texte riche dans ma boîte de texte riche (champ remarques du groupe MesChamps situé à la racine de la source de données principale) :

[csharp]
try
{
string commentaires_riches;
// on récupère ici ce champ (voir billet cité ci-dessus)

XPathNavigator champ =
this.MainDataSource.CreateNavigator();
champ.SelectSingleNode(
"/my:mesChamps/my:commentaires",
NameSpaceManager
);
/*
* Utilisez InnerXml pour définir totalement le champ.
* Si vous voulez rajouter les commentaires
* après le texte : AppendChild(commentaires)
* avant le texte : PrependChild(commentaires)
*/
champ.InnerXml = commentaires;
}
catch ...
Important : pour AppendChild et PrependChild : il peut y avoir des problèmes. En effet le code xhtml à l'intérieur des rich text est parfois comme ceci : <html xmlns="tata">tata</html> mais on a parfois seulement le tata... Dans le premier cas j'imagine (je n'ai pas testé) qu'il faille faire un champ.MoveToFirstChild(); avant le AppendChild / PrependChild.

Remarque : si rien ne s'affiche dans la boîte de teste riche, vérifiez que toutes vos balises à la racine contiennent l'attribut xmlns="http://www.w3.org/1999/xhtml" (je ne suis pas sûr à 100% de l'adresse). Par exemple ce message ne s'affichera pas :

[xml]
<div>titi</div>
<div xmlns="http://www.w3.org/1999/xhtml">tutu</div>

Pour remédier à ce problème et pour éviter d'avoir à modifier toutes les balises à la racine, je vous conseille de les entourer de la balise html qui doit contenir le namespace :

[xml]
<html xmlns="http://www.w3.org/1999/xhtml">
<div>titi</div>
<div xmlns="http://www.w3.org/1999/xhtml">tutu</div>
</html>

Vous pourrez remarquer qu'il n'y a pas besoin d'enlever le namespace pour les éléments fils (bon, c'est pas ce qu'il y a de plus propre mais ça marche...).

Note : ce billet est un clean de ceux que j'ai posté sur le forum infopathdev

Aucun commentaire: