# Dotnet > Gnral Dotnet > Dveloppement Office System > InfoPath > [IP-2010] Zone selection multiple (listbox) C#

## Logann23

Bonjour
J'aimerais utiliser les fonctions classiques d'une liste box (ajouter des lments, lire les lment, slectionner...)
si quelqu'un avait les fonctions pour, je suis intress.



```

```

Mes questions : comment ajouter des lments dans ma liste en mode "non slectionn" car par dfaut ils sont cochs.
Quand je les dcoches ils sont supprim, pourquoi ?

mon dernier lment insr apparait 2 fois dans ma liste (a la fin et au dbut) 
donc doublon, si je le d-slectionne les deux disparaissent

Bref  ::): , je suis en train de m'amuser avec ce composant liste, et n'ayant trouv que trop peu d'information, c'est le moyen d'en rajouter ici

Merci d'avance

----------


## billout rm

Bonjour,

En fait la technique est de peupler cette listbox  partir d'une connexion de donnes.

Pour cela il faut suivre la mthode suivante.
Crer une connexion de donnes en rception vers un fichier XML.Slectionner les proprits de votre ListBox puis slectionner "Rechercher des choix dans une source de donnes externes" en utilisant votre connexion de donnes qui apparaitra dans la zone de listes droulantes.Ce document XML pourra tre peupl par le code ou pr-peupl directement.Cordialement.

----------


## Logann23

Merci pour les informations.

La mthode de connexion au fichier XML passe avec sharepoint 2010?
Et pourquoi coder le fichier XML alors que je code dans infopath?
infopath est-il si limit?

En faite, je voulais viter de passer par une connexion pour justement permettre a l'utilisateur de choisir entre 3 boutons
Chaque bouton ayant une requte lgrement diffrente.

C'est pour cela que je cherche a modifier la Requte SQL de ma connexion a la base. (ou directement remplir ma Listebox, qui se remplit correctement, mais les cases a cocher sont slectionnes par dfaut)

Sinon je passe par 3 vues "une par action bouton"?

----------


## billout rm

Pardon, je n'ai pas t assez clair.
Tout d'abord il faut crer le fichier XML qui sera en fait un fichier de ressource du formulaire InfoPath, stock  l'intrieur de celui-ci!
Et la connexion de donnes en reception de ce document XML pointera sur le fichier de ressource. Elle permet en fait de crer une source de donnes secondaire base sur ce document XML. Ainsi il sera facile de connecter cette source de donnes secondaire au champ.
Pour ajouter un fichier de ressource, simplement aller dans l'onglet donnes puis slectionner "fichier de ressouces".

Si vous pr-peuplez directement le document XML, vous n'aurez pas de code  raliser.

Une fois que aurez ralis les manipulations, vous verrez que ce n'est pas si compliqu.

Cordialement.

----------


## Logann23

Merci, pour lintgration du fichier XML je vois comment faire.
Me reste plus qu'a faire mon Xml, ou j'avoue tre plutt trs dbutant et perdu.

Mais la j'ai besoin que de requte simple
genre select Client from table where pays = 'Pays'
et le faire par pays en gros (donc 15  20+ fichiers de ressources XML?).
Les fichier XML sont des donnes fixes, c'est bien a? 

Vous disiez que je pourrais insrer du code? car si c'est le cas j'ai juste besoin d'un Xml(et pourquoi pas directement infopath) avec une fonction dynamique de requte?
Lien de votre blog

Voila pourquoi je voulais par Code C#, rcuprer la valeur de mon champs 'Pays' histoire de faire une requte dynamique toute simple  ::): , et donc me servir du formulaire Web comme une simple IHM. C'est assez frustrant de pas pouvoir coder a  ::): 

a existe pas la simplicit dans infopath on dirait :s?

----------


## billout rm

Bonjour,

Je penses que la solution est de ne disposer que d'un seul fichier XML.
Ensuite vous avez 2 stratgies possibles:
Remplir votre XML avec toutes les valeurs possibles (puis filtrer en fonction d'une valeur dans votre formulaire en fonction des cas),Avoir un fichier XML sans donnes et le remplir par code  chaque modification d'une valeur dans votre formulaire InfoPath.Cordialement.

----------


## Logann23

Merci, alors j'ai ajout ma connexion a mon fichier Xml
je dois donc remplir mon Xml File avec les data de ma requete SQL? 
pour ensuite les afficher, si je comprends bien.
auriez vous un petit exemple? j'avoue etre un peu perdu.
Voici le code de votre blog que j'ai essayer de modifier


```

```

//my:group1/my:Lst_Test -> nom de ma Multiple selection list box sur infopath (j'ai juste insrer le control, rien d'autre)

j'aimerais utiliser ce system pour ajouter une node (et donc le faire en repetition)


Note:
il n'existe aucun moyen de "uncheck" les items que j'ai ajout dans ma liste?

Car tout fonctionne sauf que l'item ajout est par dfaut coch et je n'arrive pas a trouver la proprit .checked ou un truc comme a.

----------


## billout rm

Alors pour rsumer:
Le contrle "Zone de slection multiple" n'est pas trs simple dans InfoPath. Il existe une diffrence entre les valeurs affiches et les valeurs slectionnes.

Si vous repartez d'un exemple simple, vous verrez que les valeurs affiches dans ce contrle peuvent provenir de valeurs que vous positionnez dans le formulaire ("Entrer manuellement des choix", "Rechercher des choix dans une source de donnes externe").

Dans cette partie la, nous avons donc les valeurs affiches dans la zone de liste multiple (coches ou non).

Maintenant, attardons nous sur les valeurs slectionnes et dselectionnes. InfoPath possde un structure extensible pour ce champ. En fait lorsque vous slectionnez une valeur, le champ extensible prend une entre avec la valeur slectionne.

Il est donc important de comprendre la dcorrlation entre l'endroit o les donnes sont stockes (en dur dans le template ou dans une connexion de donnes externe) et l'endroit o les valeurs coches sont enregistre (dans le xml du formulaire en cours).

Donc par le code, ce contrle comporte une double difficult.
Il faut tout d'abord russir  peupler correctement la zone de liste multiple avec toutes les valeurs que vous souhaitez.
Ensuite il faudra vous attarder  la mthode permettant de slectionner / dselectionner par le code les valeurs affiches.


Cordialement.

----------


## Logann23

Justement je suis arriv en cherchant un peu a afficher les donnes dans la liste (rien de trop difficile a ce niveau)(cf code de mon tout premier post)
ensuite un doublon se cr, je le delete donc ma liste est pleine et exacte mais coche... 

Et c'est bien la tout mon probleme ^^. Sinon je peux recuperer le code XML et remplacer ou ajouter des chaines dans mes champs pour les decocher
Mais je n'ai trouv aucune info sur les attributs "checked, uncheked".

Sinon est il possible de creer X connexions de donnes
et attribuer a la liste tel ou tel "Connexion"  et de forcer un load()?

Merci.

----------


## billout rm

Je crois que l'on n'est pas du tout sur la mme longueur d'ondes...

La manire dont vous peuplez dans votre premier post, permet uniquement de rajouter des valeurs coches! En effet vous rajoutez chaque item dans la partie du formulaire qui stocke les valeurs *coches* dans ce contrle... Donc lorsque vous dcochez, l'lment disparait! Cela est entirement normal.

Pour bien faire, il faut tout d'abord correctement peupler votre contrle avec des valeurs non coches. C'est cela que vous ne savez pas faire. Aller dans Proprits sur le contrle en faisant un clic droit puis entrer des valeurs manuellement (par exemple A, B, C, D).
Vous verrez que ces valeurs apparaissent dcoches...

Ensuite ralisez votre code que vous aviez post dans le premier post. Par exemple ralisez le pour B et D. Vous verrez que le formulaire se charge avec B et D cochs et que lorsque vous dcochez la valeur, l'lment reste affich dcoch car il est enregistr dans les valeurs possibles du contrle.

Vous comprendrez la diffrence entre l'endroit o positionner des valeurs  afficher dans le contrle (enregistr dans le template) et l'endroit ou stocker les valeurs coches (votre lment extensible Lst_Test).

Cordialement

----------


## Logann23

Merci pour votre aide  ::): . 
N'ayant pas les bases ^^, je rflchi en mode Pur C# comme sous Visual studio, donc avec une logique de "controles standards "(ou remplir une listebox se fait en 2 min).

Alors j'ai un petit soucis, j'ai repris un code et un model Xml



```

```



```

```

faut-il obligatoirement ajouter un tableau extensible avec un control pour afficher un seul lment :  ici "Value" valeur du champs Emplacement_ID?

autre petite question le form sera dispo sous sharepoint et intra/internet
Je dois obligatoirement dev part du webservice pour proteger ma bdd?

----------


## billout rm

Bonjour,

Oui vous avez raison, le passage de contrle standard  InfoPath est parfois assez rude. Cela provient du mode de conception d'InfoPath qui comprend un modle puis un xml associ  ce modle.

Pour votre connexion de donnes, oui vous tes oblig de faire comme  vous avez ralis. Il faut que ce soit extensible pour qu'InfoPath affiche X lignes dans le contrle zone de liste multiple.


Pour votre dernire question, vous avez le libre choix.
Soit passer par des web services, soit aller directement interrog une procdure stocke de la base de donnes (ce que vous auriez fait dans le web services...). Si la base est accessible depuis le serveur SharePoint et que le connecteur  la base est install sur le serveur (ODBC, Oracle client,...), vous n'avez pas d'intrt majeur  passer par un web service.
Personnellement, je partirai sur une V1 en faisant l'appel  la procdrure stocke directement dans le code du formulaire.

----------


## Logann23

Merci  ::): , pourriez vous m'aider pour mon 'dernier' (je l'espre) blocage?



```

```




> L'exception System.Xml.XmlException n'a pas t gre par le code utilisateur
>   Message="Dclaration XML inattendue. La dclaration XML doit tre le premier noeud du document et aucun espace blanc ne doit tre plac avant. Ligne 1, position 9."
>   Source="System.Xml"
>   LineNumber=1
>   LinePosition=9
>   ...


J'ai regard ce type d'erreur et j'ai recr mon .xml sans espace

xml:


```

```

----------


## billout rm

Attention, je crains qu'il n'y ait une confusion.
Vous construisez un fichier XML par contre le problme est que vous essayez d'affecter ce fichier XML au champ par le code d'aprs ce que je vois.

Afin de vous aider, je vous ai ralis ce petit bout de code en LINQ qui permet de rajouter des lments  une source de donnes de type XML:



```

```

Ensuite vous avez uniquement  relier votre connexion de donnes "EMPLACEMENTS"  la zone de liste par l'interface SharePoint. Pour cela, raliser un clic droit sur la zone de liste puis "Proprits" puis "Source de donnes secondaires".

----------


## Logann23

En faite je souhaitais juste remplir ma liste avec ma source de donne Xml,
comme vous m'aviez conseill.
Donc j'ai :
- cr une source Fichier ressource XML.
- complter (avec les rsultats de ma requte SQL (dynamique)
   ->mon Fichier XML pour que le formulaire l'affiche 'en auto'.

Je pensais, suite au diffrents code que j'avais trouv, et votre blog  ::):  
utiliser ce code pour "intgrer mes donnes", et donc crer un code Xml temporaire et l'afficher dans ma liste
- ou changer le contenu du Fichier de ressource (mais je n'ai pas trouv comment faire encore)

J'ai donc tester la mthode avec le code Linq (je connais trs peu).
j'ai modifi 

```
DataConnections["RRHS"].Execute(); -> DataConnections["Emplacements"].Execute();
```




> -> string myNameSpace = navEMPLACEMENTS.GetNamespace("dfs");  me retourne "" et au final j'affiche les donnes de mon fichier XML ^^ 
> case a cocher(vide) ; pas de valeur
> case a cocher(vide) ; 2
> case a cocher(vide) ; 3
> Donc il affiche parfaitement (sauf premiere valeur) mes donnes brut Xml mais pas celle ajout par new XElement...


Je cherche pourquoi XElement XEMPLACEMENT = new XElement... ne crer pas de nouvel lment, dans le NavEmplacements.outerXml on a ca : 

```
OuterXml = "<Emplacements><Emplacements><Value>5</Value><Descriptif>des5</Descriptif></Emplacements></Emplacements>"
```

il ne supprime pas compltement les lignes de mon XML
et j'ai recopier 4 fois cette ligne pour ajouter 4 nouveaux lments, et je n'affiche que 3 lments a chaque fois (car 3 lments dans mon fichier Xml)
et le premier lment n'affiche que la case a cocher et pas de valeur

La struture de mon fichier XML est elle correcte? car elle passe si je 
//if ((firstChild != null) && (lastChild != null))
//                firstChild.DeleteRange(lastChild);

Bref voila pour la partie infopath, aprs pour associer la source de donne a ma zone de liste slection multiple, je reste dans infopath(comme habituellement)?  c'est juste pour comprendre ce que vous voulez dire par : "par l'interface SharePoint"



Merci encore d'avance,

----------

