Précédent   Forum des professionnels en informatique > Dotnet > Général Dotnet > Développement Office System > InfoPath
InfoPath Forum d'entraide sur InfoPath (concevoir des formulaires basés sur XML)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/01/2012, 12h24   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Par défaut Zone selection multiple (listbox) C#

Bonjour
J'aimerais utiliser les fonctions classiques d'une liste box (ajouter des éléments, lire les élément, sélectionner...)
si quelqu'un avait les fonctions pour, je suis intéressé.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public void main()
{
     XPathNodeIterator mesEmplacements = DataSources[0].CreateNavigator().Select("/my:mesChamps/my:groupe2/my:Lst_Test", NamespaceManager);
 
     for (int i =0; i< 10; i++)
          AddItem(svalue[i]);  //tableau de donnée quelconque
}
 
 
public void AddItem(string itemId)
{
     XPathNavigator DOM = MainDataSource.CreateNavigator();
     XPathNavigator group2 = DOM.SelectSingleNode("//my:mesChamps/my:groupe2", NamespaceManager);
     XPathNavigator field2 = DOM.SelectSingleNode("//my:mesChamps/my:groupe2/my:Lst_Test", NamespaceManager);
     XPathNavigator newNode = field2.Clone();
 
     newNode.SetValue(itemId);
     group2.AppendChild(newNode);
}
Mes questions : comment ajouter des éléments dans ma liste en mode "non sélectionné" car par défaut ils sont cochés.
Quand je les décoches ils sont supprimé, pourquoi ?

mon dernier élément inséré apparait 2 fois dans ma liste (a la fin et au début)
donc doublon, si je le dé-sélectionne 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
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 12h28   #2
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Bonjour,

En fait la technique est de peupler cette listbox à partir d'une connexion de données.

Pour cela il faut suivre la méthode suivante.
  • Créer une connexion de données en réception vers un fichier XML.
  • Sélectionner les propriétés de votre ListBox puis sélectionner "Rechercher des choix dans une source de données externes" en utilisant votre connexion de données qui apparaitra dans la zone de listes déroulantes.
  • Ce document XML pourra être peuplé par le code ou pré-peuplé directement.
Cordialement.
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 09h27   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Merci pour les informations.

La méthode 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 requête légèrement différente.

C'est pour cela que je cherche a modifier la Requête SQL de ma connexion a la base. (ou directement remplir ma Listebox, qui se remplit correctement, mais les cases a cocher sont sélectionnées par défaut)

Sinon je passe par 3 vues "une par action bouton"?
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h04   #4
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Pardon, je n'ai pas été assez clair.
Tout d'abord il faut créer le fichier XML qui sera en fait un fichier de ressource du formulaire InfoPath, stocké à l'intérieur de celui-ci!
Et la connexion de données en reception de ce document XML pointera sur le fichier de ressource. Elle permet en fait de créer une source de données secondaire basée sur ce document XML. Ainsi il sera facile de connecter cette source de données secondaire au champ.
Pour ajouter un fichier de ressource, simplement aller dans l'onglet données puis sélectionner "fichier de ressouces".

Si vous pré-peuplez directement le document XML, vous n'aurez pas de code à réaliser.

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

Cordialement.
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h10   #5
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Merci, pour l’intégration du fichier XML je vois comment faire.
Me reste plus qu'a faire mon Xml, ou j'avoue être plutôt très débutant et perdu.

Mais la j'ai besoin que de requête 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 données fixes, c'est bien ça?

Vous disiez que je pourrais insérer 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 requête?
Lien de votre blog

Voila pourquoi je voulais par Code C#, récupérer la valeur de mon champs 'Pays' histoire de faire une requête 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?
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h17   #6
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Bonjour,

Je penses que la solution est de ne disposer que d'un seul fichier XML.
Ensuite vous avez 2 stratégies 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 données et le remplir par code à chaque modification d'une valeur dans votre formulaire InfoPath.
Cordialement.
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h00   #7
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
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
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
XmlDocument doc = new XmlDocument();
 
XmlNode group = doc.CreateElement("group1", NamespaceManager.LookupNamespace("my"));
 
XmlNode field = doc.CreateElement("Lst_Test", NamespaceManager.LookupNamespace("my"));
 
XmlNode node = group.AppendChild(field);
 
doc.AppendChild(group);
//Ajout du document à la source de données concernée
node.InnerText = "test";
 
MainDataSource.CreateNavigator().SelectSingleNode("//my:mesChamps/my:groupe1/my:Lst_Test", NamespaceManager).AppendChild(doc.DocumentElement.CreateNavigator());
//my:group1/my:Lst_Test -> nom de ma Multiple selection list box sur infopath (j'ai juste insérer 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 défaut coché et je n'arrive pas a trouver la propriété .checked ou un truc comme ça.
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 22h30   #8
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Alors pour résumer:
Le contrôle "Zone de sélection multiple" n'est pas très simple dans InfoPath. Il existe une différence entre les valeurs affichées et les valeurs sélectionnées.

Si vous repartez d'un exemple simple, vous verrez que les valeurs affichées dans ce contrôle peuvent provenir de valeurs que vous positionnez dans le formulaire ("Entrer manuellement des choix", "Rechercher des choix dans une source de données externe").

Dans cette partie la, nous avons donc les valeurs affichées dans la zone de liste multiple (cochées ou non).

Maintenant, attardons nous sur les valeurs sélectionnées et déselectionnées. InfoPath possède un structure extensible pour ce champ. En fait lorsque vous sélectionnez une valeur, le champ extensible prend une entrée avec la valeur sélectionnée.

Il est donc important de comprendre la décorrélation entre l'endroit où les données sont stockées (en dur dans le template ou dans une connexion de données externe) et l'endroit où les valeurs cochées sont enregistrée (dans le xml du formulaire en cours).

Donc par le code, ce contrôle comporte une double difficulté.
Il faut tout d'abord réussir à peupler correctement la zone de liste multiple avec toutes les valeurs que vous souhaitez.
Ensuite il faudra vous attarder à la méthode permettant de sélectionner / déselectionner par le code les valeurs affichées.


Cordialement.
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 08h55   #9
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Justement je suis arrivé en cherchant un peu a afficher les données 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 cochée...

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 données
et attribuer a la liste tel ou tel "Connexion" et de forcer un load()?

Merci.
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 15h37   #10
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Je crois que l'on n'est pas du tout sur la même longueur d'ondes...

La manière dont vous peuplez dans votre premier post, permet uniquement de rajouter des valeurs cochées! En effet vous rajoutez chaque item dans la partie du formulaire qui stocke les valeurs cochées dans ce contrôle... Donc lorsque vous décochez, l'élément disparait! Cela est entièrement normal.

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

Ensuite réalisez votre code que vous aviez posté dans le premier post. Par exemple réalisez le pour B et D. Vous verrez que le formulaire se charge avec B et D cochés et que lorsque vous décochez la valeur, l'élément reste affiché décoché car il est enregistré dans les valeurs possibles du contrôle.

Vous comprendrez la différence entre l'endroit où positionner des valeurs à afficher dans le contrôle (enregistré dans le template) et l'endroit ou stocker les valeurs cocheés (votre élément extensible Lst_Test).

Cordialement
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/01/2012, 08h52   #11
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Merci pour votre aide .
N'ayant pas les bases ^^, je réfléchi 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

Code :
1
2
3
4
XPathNavigator DOM = DataSources["test"].CreateNavigator();
XPathNavigator group1 = DOM.SelectSingleNode("//Emplacements", NamespaceManager);//me retourne un root, mais 0 count
XPathNavigator field1 = DOM.SelectSingleNode("//Emplacements/Emplacement_ID/@Value", NamespaceManager);
XPathNavigator newNode = field1.Clone();
Code :
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?>
<Emplacements>
    <Emplacement_ID> <Value>1 </Value> </Emplacement_ID>
    <Emplacement_ID> <Value>2 </Value> </Emplacement_ID>
    <Emplacement_ID> <Value>3 </Value> </Emplacement_ID>
</Emplacements>
faut-il obligatoirement ajouter un tableau extensible avec un control pour afficher un seul élément : 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?
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 17h04   #12
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Bonjour,

Oui vous avez raison, le passage de contrôle standard à InfoPath est parfois assez rude. Cela provient du mode de conception d'InfoPath qui comprend un modèle puis un xml associé à ce modèle.

Pour votre connexion de données, oui vous êtes obligé de faire comme vous avez réalisé. Il faut que ce soit extensible pour qu'InfoPath affiche X lignes dans le contrôle zone de liste multiple.


Pour votre dernière question, vous avez le libre choix.
Soit passer par des web services, soit aller directement interrogé une procédure stockée de la base de données (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'intérêt majeur à passer par un web service.
Personnellement, je partirai sur une V1 en faisant l'appel à la procédrure stockée directement dans le code du formulaire.
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 09h17   #13
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
Merci , pourriez vous m'aider pour mon 'dernier' (je l'espère) blocage?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
XmlDocument doc = new XmlDocument();
 
XmlNode group = doc.CreateElement("Lst_Test_Item", NamespaceManager.LookupNamespace("my"));
 
XmlNode field = doc.CreateElement("Value", NamespaceManager.LookupNamespace("my"));
 
XmlNode node = group.AppendChild(field);
 
doc.AppendChild(group);
node.InnerText = "test_valeur";
 
field = doc.CreateElement("Descriptif", NamespaceManager.LookupNamespace("my"));
node = group.AppendChild(field);
 
node.InnerText = "test_descriptif";
 
XPathNavigator nav = MainDataSource.CreateNavigator();
ClearListBox("//mesChamps/Lst_Test/Lst_Test_Item",nav);
nav.SelectSingleNode("//mesChamps/Lst_Test/Lst_Test_Item", NamespaceManager);
nav.AppendChild(doc.DocumentElement.CreateNavigator());
Citation:
L'exception System.Xml.XmlException n'a pas été gérée par le code utilisateur
Message="Déclaration XML inattendue. La déclaration 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:
Code :
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?>
<EMP>
<Emplacements><Value>emp01</Value><Descriptif>1</Descriptif></Emplacements>
<Emplacements><Value>emp02</Value><Descriptif>2</Descriptif></Emplacements>
<Emplacements><Value>emp03</Value><Descriptif>3</Descriptif></Emplacements>
</EMP>
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 21h23   #14
Membre chevronné
 
Avatar de billout rm
 
MVP InfoPath
Inscription : juillet 2007
Messages : 556
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : MVP InfoPath

Informations forums :
Inscription : juillet 2007
Messages : 556
Points : 613
Points : 613
Attention, je crains qu'il n'y ait une confusion.
Vous construisez un fichier XML par contre le problème est que vous essayez d'affecter ce fichier XML au champ par le code d'après ce que je vois.

Afin de vous aider, je vous ai réalisé ce petit bout de code en LINQ qui permet de rajouter des éléments à une source de données de type XML:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
DataConnections["RRHS"].Execute();
XPathNavigator navEMPLACEMENTS = DataSources["EMPLACEMENTS"].CreateNavigator().SelectSingleNode("//EMPLACEMENTS", NamespaceManager);
// Recherche du namespace
string myNameSpace = navEMPLACEMENTS.GetNamespace("dfs");
XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable());
nsMgr.AddNamespace("dfs", myNameSpace);
XNamespace xmlns = (XNamespace)navEMPLACEMENTS.GetNamespace("dfs");
// Suppression des éléments vides
XPathNavigator lastChild = navEMPLACEMENTS.SelectSingleNode("child::*[position() = last()]", nsMgr);
XPathNavigator firstChild = navEMPLACEMENTS.SelectSingleNode("child::*[position() = 1]", nsMgr);
if ((firstChild != null) && (lastChild != null))
 firstChild.DeleteRange(lastChild);
XElement XEMPLACEMENT = new XElement(new XElement(xmlns + "EMPLACEMENT",
 new XElement(xmlns + "VALEUR", "ValeurValeur"),
 new XElement(xmlns + "DESCRIPTION", "ValeurDescription")));
navEMPLACEMENTS.AppendChild(XEMPLACEMENT.ToString());
Ensuite vous avez uniquement à relier votre connexion de données "EMPLACEMENTS" à la zone de liste par l'interface SharePoint. Pour cela, réaliser un clic droit sur la zone de liste puis "Propriétés" puis "Source de données secondaires".
__________________
Rémi MATAYRON
MVP InfoPath

N'hésitez pas à visiter mon blog Infopath
billout rm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 09h04   #15
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 44
Points : 10
Points : 10
En faite je souhaitais juste remplir ma liste avec ma source de donnée Xml,
comme vous m'aviez conseillé.
Donc j'ai :
- créé une source Fichier ressource XML.
- compléter (avec les résultats de ma requête SQL (dynamique)
->mon Fichier XML pour que le formulaire l'affiche 'en auto'.

Je pensais, suite au différents code que j'avais trouvé, et votre blog
utiliser ce code pour "intégrer mes données", et donc créer 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 méthode avec le code Linq (je connais très peu).
j'ai modifié
Code :
DataConnections["RRHS"].Execute(); -> DataConnections["Emplacements"].Execute();
Citation:
-> string myNameSpace = navEMPLACEMENTS.GetNamespace("dfs"); me retourne "" et au final j'affiche les données 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 données brut Xml mais pas celle ajouté par new XElement...
Je cherche pourquoi XElement XEMPLACEMENT = new XElement... ne créer pas de nouvel élément, dans le NavEmplacements.outerXml on a ca :
Code :
OuterXml = "<Emplacements><Emplacements><Value>5</Value><Descriptif>des5</Descriptif></Emplacements></Emplacements>"
il ne supprime pas complétement les lignes de mon XML
et j'ai recopier 4 fois cette ligne pour ajouter 4 nouveaux éléments, et je n'affiche que 3 éléments a chaque fois (car 3 éléments dans mon fichier Xml)
et le premier élément 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, après pour associer la source de donnée a ma zone de liste sélection 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,
Logann23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h33.


 
 
 
 
Partenaires

Hébergement Web