# Dotnet > Gnral Dotnet > Dveloppement Office System > InfoPath >  Text box filtr sur data source

## lcaufrie

J'ai une liste sharepoint que j'aimerai afficher dans infopath. J'ai fait une data source connection dans infopath sur la liste sharepoint. J'ai cre une section qui affiche le contenu de la liste. J'aimerai pouvoir filtrer cette liste sur une autre colonne de cette mme liste (example tout les records  Yes) pour n'afficher dans infopath que ceux dont la valeur est Yes

----------


## billout rm

Alors l, je vois 2 techniques qui se distinguent:
Une jolie requte CAML qui ne te renvoie que les lignes que tu souhaite... ::king:: une dataconnection que tu vas parcourir dans ton code pour ne garder que les valeurs que tu veux.Perso j'opte pour des requtes CAML qui s'utilisent facilement et ou tu n'est pas oblig de renvoyer toutes les valeurs (donc gain de performances)...

Aprs  toi de voir, tu as le choix... :;): 

Cordialement.

----------


## lcaufrie

Un tout grand merci pour ta rponse. Etant novice la dedans, pourrais-tu m'en dire un peu plus sur les requetes CAML?

----------


## billout rm

Bonjour,

En gros, c'est comme une requte SQL que tu ferais sur une liste Sharepoint.
Tu ramnes les items que tu le souhaite et tu peux ensuite parcourir tous tes items...

Il y a une syntaxe spciale. Je te conseille de tlcharger l'outil nomm U2U CAML BUILDER si je me souviens bien...

Tu fais tout dans ton code sans avoir de connexion de donnes particulires.

Cordialement.

----------


## lcaufrie

J'arrive bien avec CAML builder a filtrer ma liste, par contre je ne sais pas comment faire pour d'infopath avoir accs  ce query cr dans CAML builder?

----------


## billout rm

Bonjour,

Alors si tu es en C#, ton code va ressembler  a:



```

```

 
A tester, je n'utilises pas cette mthde mais le principe est le mme.

Cordialement.
Rmi

----------


## lcaufrie

OK. Merci. Quand j'essaye de rentrer le code dans Visual studio, j'ai une chie de message d'erreur, notamment "Error	1	The type or namespace name 'SPQuery' could not be found (are you missing a using directive or an assembly reference?)	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template11\FormCode.cs	37	13	Template1"
Autre question: O mets t'on le copy/paste du query cr dans U2U CAML?

----------


## billout rm

> OK. Merci. Quand j'essaye de rentrer le code dans Visual studio, j'ai une chie de message d'erreur, notamment "Error    1    The type or namespace name 'SPQuery' could not be found (are you missing a using directive or an assembly reference?)    C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template11\FormCode.cs    37    13    Template1"


Je pense que tu n'as pas fait monter le "using Microsoft.Sharepoint"...




> Autre question: O mets t'on le copy/paste du query cr dans U2U CAML?


Tu le mets dans les cotes  cette ligne:
mQuery.Query = "";

tu auras un truc du genre
mQuery.Query = "<where><and><...></where>";


Cordialement.
Rmi

----------


## lcaufrie

Compris pour le query. J'ai bien rajout using Microsoft.Sharepoint; mais j'ai maintenant l'erreur suivante : "Error	1	The type or namespace name 'Sharepoint' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) 7	17	Template1". Voici mon code complet: 

```

```

Est-ce que je m'y prend bien, j'ai cr un simple formulaire avec une section. J'ai rajout une text box. J'ai fait un right click dessus et selectionn Programming/changedevent?
Encore dsol de prendre su ton temps pour des questions si simple (vu mon niveau de programmation dans ce language)
Y a t'il des tuto pour la progammation en C sur infopath?

----------


## billout rm

Salut,

Ce n'est pas grave, a sert  a un forum.
Dja pas de tuto  ma connaissance pour la prog en C# sur infopath puisque c'est la mme qu'ailleurs...il n'y a que les vnements qui different.

Pour ton problme, tu n'as pas fait monter la rfrence dans ton projet.
Dans ta solution, fait un clic droit sur "Rfrence" puis va dans parcourir.
Il faut aller chercher la dll "Microsoft.Sharepoint.dll" situe dans le "C:/.../12/ISAPI".
Et la je pense que that's fine...


Cordialement

----------


## lcaufrie

Ca se corse: je n'ai pas cette dll sur mon pc et je n'arriverai certainement pas  la faire installer par notre service desk. ::cry::

----------


## billout rm

Comment a tu ne l'as pas sur ton PC!!!
Tu ne travailles pas sur le serveur (ou une machine virtuelle de dveloppement) ayant Sharepoint ou MOSS?

La a se corse.

Si tu veux faire du dev Sharepoint ou mme publier ton formulaire facilement, il faut que tu ait un Sharepoint sur la mme machine.

Si tu ne peux pas travailler sur le serveur pour des raisons de scurit videntes, il faut te monter une machine virtuelle (VMWare ou VPC) permettant de dvelopper sans soucis... et ensuite tu transfres tout sur le serveur d'intgration ou de prod.

Cordialement.

----------


## lcaufrie

Non je ne travaille pas sur le serveur directement (je n'y ai pas les droits). Je travaille avec une version installe par notre service desk sur mon PC. Donc c'est mort. Merci en tout cas de ton aide.

A+

----------


## billout rm

Dsol, bonne continuation.

----------


## lcaufrie

Tu parlais aussi d'une une dataconnection que tu vas parcourir dans ton code pour ne garder que les valeurs que tu veux.

Comment puis-je faire un filtre sur cette dataconnection?

----------


## billout rm

Oui tu as aussi cette possibilit.
Tout se fait par Xpath.

//tu slectionne toutes les donnes renvoyes par ta dataconnection
Datacomplet = DataSources["DataConnection"].CreateNavigator().SelectSingleNode("//dfs":dataFields", NamespaceManager);

//tu filtres ce que tu veux
DataFiltre = DataSources["DataConnection"].CreateNavigator().SelectSingleNode("//dfs":dataFields*[champ='toto']*", NamespaceManager);

//Tu enlves tout les lments que tu as dans ton Datacomplet.
...

//Tu rajoutes ensuite les lments que tu as slectionn dans ton datafiltre
...


a c'est le principe.
J'ai dja fait le code mais je ne l'ai pas sur cette machine...

J'espre que a te permettra un bon dpart.

Cordialement.

----------


## lcaufrie

Ca se fait aussi avec Visual Studio Tools for Applications?

----------


## billout rm

Perso je suis en VS2008 team suite donc il n'y a pas rajouter ces composants, tout est dja intgr.

Mais si tu as une verison classique, oui a se fait en tlchargeant VSTO (for Office) ou VSTA (for Application), je ne me souviens jamais avec lequel il faut travailler...

Cordialement.

----------


## lcaufrie

Donc, j'ai bien slectionn C# comme mode de programmation.
J'ai slectionn d' infopath sur la colonne de droite en data source le champ que je voudrait ramener filtrer.
je fait un right click et je slectionne Programming\Changed event.
Je tape ton code:


```

```

Et j'obtiens les erreurs suivantes

Error	1	Newline in constant	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	38	98	Template1

Error	2	Too many characters in character literal	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	41	104	Template1

Error	3	Newline in constant	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	41	111	Template1

Error	4	) expected	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	38	87	Template1
Error	5	Invalid expression term ':'	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	38	87	Template1

Error	6	; expected	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	38	88	Template1

----------


## billout rm

Ouh la! Ce que je t'ai donn n'est qu'un vulgaire algo...

Il faut l'adapter  C# et l'adapter  tes besoins.

De ce que je vois, il te manque le type de datacomplet et de datafiltre...
Il s'agit de 2 objets de type XpathNavigator.

Tu auras donc:


```

```

Donc entre [], tu prcise le nom de ta connexion de donnes.

Dja regarde si cette ligne passe bien puis ensuite tu rajouteras du code au fur et  mesure...

Cordialement.

----------


## lcaufrie

En effet, commenons par le dbut: avec juste cette ligne:


```

```

j'obtiens l'erreur Error	1	The type or namespace name 'XpathNavigator' could not be found (are you missing a using directive or an assembly reference?)	C:\data\Restricted\lcaufrie\My Documents\InfoPath Projects\Template16\FormCode.cs	39	13	Template1

----------


## billout rm

Bonjour,

Toujours pareil, ce n'est rien, c'est juste que tu ne peux l'utiliser sans faire monter la classe.
Regarde si tu as fait monter les using suivants:
     using System.Xml;
     using System.Xml.XPath;

Regardes si a marche.
Si a ne marche tjs pas et qu'il te parle de rfrence, peut-tre faut-il mettre une rfrence sur System.Xml.

Bonne journe.

----------


## lcaufrie

Maintenant a marche (les dclarations et rfrence etaient bien prsentes) mais le p de XpathNavigator n'tait pas en majuscule.

Maintenant j'ai remplac la ligne de code par celle-i: 

```

```

1: Est-ce que ma dclaration de dataconnection est correcte? o je dois utiliser ["/dfs:myFields/dfs:dataFields/dfs:Service/@Service", "Service"].
2. Est-ce que ma requte est bien dclare sur l'event changed du datasource service (le modle est Service et en dessous deux tables (Title et Service). Comme je ne veux montrer que les enregistrements Service dont Title = Voice
3. Comment rcuprer le valeur filtre de Service pour l'afficher dans un text box?

----------


## billout rm

1: Est-ce que ma dclaration de dataconnection est correcte? o je dois utiliser ["/dfs:myFields/dfs:dataFields/dfs:Service/@Service", "Service"].
[/quote]

Oui tu peux. En XPath le "//" permet de s'affranchir de mettre toute l'arborescence.





> 2. Est-ce que ma requte est bien dclare sur l'event changed du datasource service (le modle est Service et en dessous deux tables (Title et Service). Comme je ne veux montrer que les enregistrements Service dont Title = Voice


Je ne vois pas pourquoi tu le fais sur cet vnement.
Dja pour tester, tu peux le faire au load ou au clic sur un bouton (en double cliquand sur modifier le code du bouton).




> 3. Comment rcuprer le valeur filtre de Service pour l'afficher dans un text box?


Si ton filtre ne renvoie qu'un noeud, il faut que tu fasse affecte ton champ avec DataFiltre.value

----------


## lcaufrie

J'ai cr un boutton mais quand je clique dessus avec le code 


```

```

j'obtiens:

System.Security.SecurityException
Request failed.
   at Microsoft.Office.InfoPath.MsxmlNavigator.IsValidNode(MsxmlNode test)
   at Microsoft.Office.InfoPath.MsxmlNavigator.MoveToFirstChild()
   at MS.Internal.Xml.XPath.XPathDescendantIterator.MoveNext()
   at MS.Internal.Xml.XPath.DescendantQuery.Advance()
   at MS.Internal.Xml.XPath.FilterQuery.Advance()
   at MS.Internal.Xml.XPath.XPathSelectionIterator.MoveNext()
   at System.Xml.XPath.XPathNavigator.SelectSingleNode(XPathExpression expression)
   at System.Xml.XPath.XPathNavigator.SelectSingleNode(String xpath, IXmlNamespaceResolver resolver)
   at Template1.FormCode.Service__Service_attr_Changed(Object sender, XmlEventArgs e)
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.GenericProxy(Object genericDelegate, DataDOMEvent dataDOMEvent, InfoPathEvents type)
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.ChangedProxy(DataDOMEvent dataDOMEvent)
   at Microsoft.Office.Interop.InfoPath.SemiTrust._DataDOMEventSink_SinkHelper.OnAfterChange(DataDOMEvent pDataDOMEvent)

----------


## billout rm

Alors ton filtre n'est pas bon.
Pour bien faire, il faut toujours passer en Debug.
Utilise cette ligne et regarde ce qu'il y a comme donne dans DateFiltre:
XPathNavigator DataFiltre = DataSources["Service"].CreateNavigator();

Dja si cette ligne ne marche pas, tu as un soucis sur ta dataconnection.
Ensuite si elle marche, il faut que tu regardes ce que tu as comme donne  l'intrieur de DataFiltre (voir si tu as bien dfs ::D: ataFields ou encore si tu as Title).
Si tu ne trouves pas, poste une partie de ton xml.

Coridalement.

----------


## lcaufrie

Comme je n'y arrivai pas par cette methode j'ai fait autrement: J'avais dj essay de crer une vue filtre de ma liste sharepoint mais a ne marchait pas. Par contre si j'applique le filtre sur la vue all items, alors a marche. ::D:

----------


## billout rm

Ouf, et ben voila, tout est bien qui finit bien...

Bon courage pour la suite.

Cordialement.

----------


## Wassim BEN ABDELAZIZ

Je pense qu'il ne faut pas se plonger dans le dev.
Tu peut filtrer les donnes de ta liste avec le composant web part Filter (tu lui donne ta formule "si la valeur de la colonne x de la liste Y = value alors tu applique l'action Z") comme ca tu auras les donnes filtres avant mme la rcupration  partir du formulaire InfoPath

----------


## billout rm

Bonjour, pas mal comme astuce.

J'aimerais juste savoir si cette webpart est pilotable.
Je m'explique, lorsque vous avez 2 combos en cascade dans infopath et que vous voulez la seconde en fonction de la premire.

La seconde zone de liste droulante dpend donc d'aprs votre technique de la webpart filter...

Comment fait-on pour filtrer dynamiquement cette webpart en fonction de la valeur saisie dans la premire zone de liste drouante???

Cordialement.

----------


## Wassim BEN ABDELAZIZ

Ca c'est une autre chose, pour le webpart Filter c'est au niveau des donnes de la liste (pour filter les donnes de ta liste selon un critre comme ca tu auras tes infos filtr avant de passer au formulaire Infopath)
Pour ta question sur les deux combobox :
On peut faire ca avec le natif Infopath sans Dev, dans les options de la deuxime Combo tu applique ce qu'on appelle des rgles sur le contenu "Rules" selon la valeur slectionn dans le premier Combo (il te donne la main de choisir quel control tu va utiliser pour satisfaire la rgle).

----------


## billout rm

Tout  fait mais le gros inconvnient de cette mthode est qu'elle ne fonctionne pas pour un formulaire conu pour le navigateur (Infopath Form Services).

Aprs s'il s'agit d'un formulaire classique, je suis d'accord avec toi.

Cordialement.

----------


## Wassim BEN ABDELAZIZ

un formuliare infopath tourne bien sur le navigateur  travers infopath form services et qui contient des rules (tu peut vrifier avec le chek-in).

----------


## billout rm

En fait je ne parlais pas des rgles mais des filtres sur les combos.
Les filtres sur des combos ne fonctionent pas en form services.

Aprs si tu arrives  le faire par des rgles, cela doit fonctionner mais je ne vois pas comment faire si tu te base sur la mme liste.
Il doit y avoir quelque chose qui m'chappe.
Tu as un exemple?

Cordialement.

----------

