Share via


Exemples de solutions en bac à sable (sandbox)

Les formulaires InfoPath 2010 avec code managé peuvent être publiés sur l’infrastructure solution en bac à sable (sandbox) SharePoint à partir du concepteur InfoPath 2010. Cette rubrique fournit deux exemples qui montrent le type de code que vous pouvez écrire dans un modèle de formulaire solution en bac à sable (sandbox) InfoPath et comment publier ce modèle.

Exemple1 : tri des données dans un bon de commande

Une tâche utile, comme trier les données dans un tableau extensible, peut être effectuée à l’aide de code dans un formulaire InfoPath. Pour ce faire, le code réordonne les nœuds dans un document XML sous-jacent qui est affiché dans le formulaire InfoPath. Bien que le scénario décrit dans cette rubrique est conçu pour publier directement un formulaire InfoPath en tant que solution en bac à sable (sandbox), celui-ci peut également être déployé comme un modèle de formulaire approuvé par l’administrateur.

Avant de commencer, vérifiez que vous remplissez les conditions suivantes.

  • Vous êtes administrateur de collection de sites sur le site SharePoint Server 2010 ou SharePoint Foundation 2010 sur lequel vous souhaitez publier le formulaire.

  • Le langage de programmation que vous avez choisi pour le modèle de formulaire est C# ou Visual Basic, non suivi d’un nom de version antérieure. Les versions des langages de programmation et des modèles objet compatibles InfoPath 2007 ou InfoPath 2003 ne sont pas prises en charge pour solutions en bac à sable (sandbox). Pour savoir comment spécifier le langage de programmation, voir Procédure d'installation et de développement avec Visual Studio Tools for Applications.

Pour créer un modèle de formulaire qui trie les données dans un contrôle Tableau extensible sur le formulaire, procédez comme suit.

Pour créer un modèle de formulaire qui trie les données dans le formulaire par programmation

  1. Créez un modèle de formulaire dans le concepteur InfoPath, puis ajoutez un contrôle Tableau extensible sur ce formulaire. Le code de cet exemple trie les lignes en fonction de la première colonne du tableau, mais vous pouvez facilement le modifier afin d’utiliser une autre colonne.

  2. Ajoutez un contrôle Bouton au formulaire. Le code pour trier le tableau sera ajouté au gestionnaire d’événements pour l’événement Clicked du bouton, mais vous pouvez également utiliser un autre événement à cet effet.

  3. Sélectionnez le bouton, cliquez sur l’onglet Propriétés, puis cliquez sur Code personnalisé. Si vous n’avez pas encore enregistré votre formulaire, vous êtes invité à le faire, puis l’éditeur de code s’ouvre avec le curseur positionné sur le gestionnaire d’événements du bouton.

  4. Collez le code suivant dans le gestionnaire d’événements du bouton. Ce code place les éléments de la première colonne dans un tableau, trie ce tableau, puis réorganise le tableau initial en se basant sur ce dernier. Ce code suppose que les données triées sont de type chaîne.

    // Put the elements from the first column into an array.
    XPathNavigator root = this.CreateNavigator();
    
    // Create a node iterator which contains only the values that you want to sort.
    // For this form, the entire table is in "group1", each row is a "group2"
    // and the rows are "field1", "field2" and "field3" respectively.
    XPathNodeIterator nodeIterator = root.Select(
        "/my:myFields/my:group1/my:group2/my:field1", this.NamespaceManager);
    
    // Create arrays to use for sorting.
    string[] sortArrayWords = new string[nodeIterator.Count + 1];
    int[] sortArrayKeys = new int[nodeIterator.Count + 1];
    int arrayPosition = 1;
    
    // Populate the arrays for sorting.
    while (nodeIterator.MoveNext()) 
    {
        // Loop until there are no more elements
        sortArrayWords[arrayPosition] = nodeIterator.Current.Value;
        sortArrayKeys[arrayPosition] = arrayPosition;
        arrayPosition += 1;
    }
    
    // Sort the array.
    Array.Sort(sortArrayWords, sortArrayKeys);
    arrayPosition = 0;
    
    // Create new XML to update the table.
    string newTableXML = "";
    // Iterate through the sorted array of keys.
    for (int i = 1; i <= sortArrayWords.Length - 1; i++) 
    {
        nodeIterator = root.Select(
            "/my:myFields/my:group1/my:group2", this.NamespaceManager);
    
        // Go to the right position in the table.
        for (int j = 1; j <= sortArrayKeys[i]; j++) 
        {
            nodeIterator.MoveNext();
        }
    
        // Add the row to the XML.
        newTableXML += nodeIterator.Current.OuterXml;
    }
    
    // Set the table to use the new XML.
    root.SelectSingleNode(
        "/my:myFields/my:group1", this.NamespaceManager).InnerXml = newTableXML;
    
    ' Put the elements from the first column into an array.
    Dim root As XPathNavigator = Me.CreateNavigator
    
    ' Create a node iterator which contains only the values that you want to sort
    ' For this form, the entire table is in "group1",
    ' each row is a "group2"
    ' and the rows are "field1", "field2" and "field3" respectively.
    Dim nodeIterator As XPathNodeIterator = root.Select( _
        "/my:myFields/my:group1/my:group2/my:field1", Me.NamespaceManager)
    
    ' Create arrays to use for sorting.
    Dim sortArrayWords(nodeIterator.Count) As String
    Dim sortArrayKeys(nodeIterator.Count) As Integer
    Dim arrayPosition As Integer = 1
    
    ' Populate the arrays for sorting.
    While nodeIterator.MoveNext() ' Loop until there are no more elements
       sortArrayWords(arrayPosition) = nodeIterator.Current.Value
       sortArrayKeys(arrayPosition) = arrayPosition
       arrayPosition += 1
    End While
    
    ' Sort the array.
    Array.Sort(sortArrayWords, sortArrayKeys)
    arrayPosition = 0
    
    ' Create new XML to update the table.
    Dim newTableXML As String = ""
    ' Iterate through the sorted array of keys.
    For i As Integer = 1 To sortArrayWords.Length - 1
       nodeIterator = root.Select( _
          "/my:myFields/my:group1/my:group2", Me.NamespaceManager)
    
       ' Go to the right position in the table.
       For j As Integer = 1 To sortArrayKeys(i)
         nodeIterator.MoveNext()
       Next
    
    ' Add the row to the XML.
    newTableXML &= nodeIterator.Current.OuterXml
    Next
    
    ' Set the table to use the new XML.
    root.SelectSingleNode("/my:myFields/my:group1", _
        Me.NamespaceManager).InnerXml = newTableXML
    
  5. Pour publier votre formulaire, procédez comme suit.

    1. Cliquez sur SharePoint Server sur l’onglet Publier dans Backstage.

    2. Entrez l’URL du site SharePoint sur lequel publier, puis cliquez sur Suivant.

      Important

      Vous devez être administrateur de collection de sites sur ce site pour publier ce modèle de formulaire en tant que solution en bac à sable (sandbox).

    3. Sélectionnez Bibliothèque de formulaires, puis cliquez sur Suivant.

    4. Sélectionnez Créer une bibliothèque de formulaires, puis cliquez sur Suivant.

    5. Entrez le nom et la description de votre bibliothèque de formulaires, puis cliquez sur Suivant.

    6. Cliquez sur Publier.

Exemple 2 : gestion des fournisseurs dans une liste SharePoint

Cet exemple comprend de la programmation par rapport au modèle objet Microsoft SharePoint Foundation 2010. Pour cela, vous devez établir une référence à l’assembly Microsoft.SharePoint.dll qui est installé avec une copie sous licence de SharePoint Server 2010.

La bibliothèque Microsoft.SharePoint.Server.dll est installée par défaut dans C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI. Elle doit être incluse dans les projets où vous programmez en fonction du modèle objet SharePoint. Pour établir une référence à Microsoft.SharePoint.dll dans un projet Microsoft Visual Studio Tools for Applications, ouvrez l’Éditeur de code, puis cliquez sur Ajouter une référence dans le menu Outils. Dans la boîte de dialogue Ajouter une référence, cliquez sur l’onglet Parcourir, spécifiez l’emplacement du fichier Microsoft.SharePoint.dll, puis cliquez sur OK. Cela copie Microsoft.SharePoint.dll dans le répertoire du projet afin que vous puissiez utiliser les membres du modèle objet SharePoint Foundation 2010 dans votre solution InfoPath.

Conception du formulaire et développement du code

À partir du code dans un formulaire InfoPath, vous pouvez utiliser le modèle objet SharePoint pour créer des éléments dans des listes de recherche. Cela est utile pour le remplissage d’une zone déroulante à partir d’une liste SharePoint, si vous souhaitez ajouter de nouvelles valeurs à cette zone sans créer de formulaire distinct. Cet exemple utilise une zone de liste déroulante pour afficher toutes les valeurs actuellement dans la liste et crée la logique de programmation pour ajouter la valeur à la liste si elle n’y figure pas encore.

Pour créer un modèle de formulaire qui puisse ajouter de nouveaux éléments à une zone de liste déroulante basée sur une liste SharePoint

  1. Insérez un contrôle Zone de liste déroulante sur votre formulaire, puis renommez le champ associé à cette zone myCombo.

  2. Pour créer la connexion de données à la liste qui sera utilisée pour remplir la zone de liste déroulante, procédez comme suit.

    1. Sur l’onglet Données, cliquez sur le bouton À partir de la liste SharePoint dans le groupe Données externes.

    2. Entrez l’URL du site qui contient la liste, puis cliquez sur Suivant.

    3. Sélectionnez la liste, puis cliquez sur Suivant.

    4. Sélectionnez les champs que vous souhaitez inclure : pour cet exemple, sélectionnez Titre et ID. Titre contient les valeurs à rechercher. Cliquez sur Suivant.

    5. Cliquez sur Suivant dans l’écran suivant.

    6. Nommez la connexion de données LookupList, puis cliquez sur Terminer.

  3. Pour remplir la zone de liste déroulante à partir de la liste, procédez comme suit.

    1. Sélectionnez la zone de liste déroulante que vous avez créée à l’étape 1.

    2. Cliquez sur Modifier les choix sur l’onglet Propriétés Outils de contrôle du ruban.

    3. Sélectionnez Rechercher des choix dans une source de données externe.

    4. Vérifiez que la Source de données est définie sur la connexion que vous avez créée à l’étape 2.

    5. Définissez la valeur et le nom complet pour Titre.

  4. Ajoutez un contrôle Bouton au formulaire. Lorsqu’un utilisateur clique sur le bouton, le code s’exécute. Dans un formulaire de production, cette logique peut s’exécuter au moment de l’envoi ou lorsque la valeur change dans la zone de liste déroulante. Étant donné que le code ne modifie rien sur le formulaire, il est recommandé que cette logique s’exécute au moment de l’envoi pour éviter une opération de réaffichage inutile.

  5. Sélectionnez le bouton. Sur l’onglet Propriétés Outils de contrôle du ruban, cliquez sur Code personnalisé. Si vous n’avez pas encore enregistré votre formulaire, vous êtes invité à le faire.

  6. Ajoutez une référence à l’assembly Microsoft.SharePoint.dll comme décrit plus haut dans cette rubrique.

  7. L’exemple suivant est un exemple simple auquel votre code peut ressembler. En premier lieu, il vérifie si la valeur présente dans la zone de liste déroulante figure dans la liste, et crée un nouvel élément si nécessaire. N’oubliez pas que vous devez disposer de tous les membres du modèle objet SharePoint que vous utilisez dans votre code, sinon le code génèrera une exception.

    // Get the value of the combo box
    XPathNavigator root = this.CreateNavigator();
    string theComboVal = root.SelectSingleNode("/my:myFields/my:myCombo", this.NamespaceManager).Value;
    
    // Get the list
    SPSite mySite = new SPSite("http:// YourServer/YourSite/");
    SPWeb myWeb = mySite.RootWeb;
    SPList myList = myweb.Lists("LookupList");
    
    // Query the list to see if it contains the item
    SPQuery myQuery = new SPQuery();
    myQuery.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + theComboVal + "</Value></Eq></Where>";
    SPListItemCollection myListItemCollection = myList.GetItems(myQuery);
    
    // If the query returns no items, create one
    if (myListItemCollection.Count == 0) 
    {
        SPListItemCollection listItems = myList.Items;
        SPListItem newItem = listItems.Add();
        newItem("Title") = theComboVal;
        newItem.Update();
    }
    
    // Dispose of SharePoint items
    myWeb.Dispose();
    mySite.Dispose();
    
    ' Get the value of the combo box
    Dim root As XPathNavigator = Me.CreateNavigator
    Dim theComboVal As String = root.SelectSingleNode("/my:myFields/my:myCombo",   Me.NamespaceManager).Value
    
    ' Get the list
    Dim mySite As SPSite = New SPSite("http:// YourServer/YourSite/")
    Dim myWeb As SPWeb = mySite.RootWeb
    Dim myList As SPList = myweb.Lists("LookupList")
    
    ' Query the list to see if it contains the item
    Dim myQuery As New SPQuery()
    myQuery.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + theComboVal + "</Value></Eq></Where>"
    Dim myListItemCollection As SPListItemCollection = myList.GetItems(myQuery)
    
    ' If the query returns no items, create one
    If myListItemCollection.Count = 0 Then
        Dim listItems As SPListItemCollection = myList.Items
        Dim newItem As SPListItem = listItems.Add()
        newItem("Title") = theComboVal
        newItem.Update()
    End If
    
    ' Dispose of SharePoint items
    myWeb.Dispose()
    mySite.Dispose()
    
  8. Pour publier votre formulaire, procédez comme suit.

    1. Cliquez sur SharePoint Server sur l’onglet Publier dans Backstage.

    2. Entrez l’URL du site SharePoint sur lequel publier, puis cliquez sur Suivant.

      Important

      Vous devez être administrateur de collection de sites sur ce site pour publier ce modèle de formulaire en tant que solution en bac à sable (sandbox).

    3. Sélectionnez Bibliothèque de formulaires, puis cliquez sur Suivant.

    4. Sélectionnez Créer une bibliothèque de formulaires, puis cliquez sur Suivant.

    5. Entrez le nom et la description de votre bibliothèque de formulaires, puis cliquez sur Suivant.

    6. Cliquez sur Publier.