none
Développement sous Visual studio pour Sharepoint RRS feed

  • Discussion générale

  • Bonjour,

    N'ayant pas pu réussir une manipulation via le designer je me décide donc de passer par le code.

    En effet,

    Je souhaite récuperer les élements d'une liste et si le nom d'un dossier est contenu dans un élément, je souhaite basculer cet élément dans le dossier.

    En gros :

    Liste A

    Outlook (dossier)

    Ma demande Outlook (element)

    je souhaite donc basculer cet élément dans le dossier outlook vu que le nom du dossier est contenu dans l'élément.

    J'ai commencé donc par ça :

    mais je bloque..

    SPSite SiteCollection = SPContext.Current.Site;
                
                SPWeb site = SiteCollection.AllWebs["http://test-sharepoint"];
                SPList Liste = site.Lists["Base de Connaissances"];
               
    SPListItemCollection collListItems = site.Lists["Base de Connaissances"].Items;
    SPListItemCollection collFolder = site.Lists["Base de Connaissances"].Folders;
    foreach (SPListItem ListItem in collListItems)
    {
        
        if(ListItem.Name.Contains(collFolder.ToString)== true) // je ne sais pas :/
        {
        }
       

    • Déplacé Pascal P vendredi 7 septembre 2012 15:05 Mauvais forum ;) (Origine :Sharepoint 2010, 2007 et versions antérieures pour les professionnels IT)
    • Type modifié Gokan OzcifciMVP vendredi 19 octobre 2012 11:30 Pas de réponse
    • Type modifié Dam.L mardi 20 novembre 2012 10:07 MAJ
    • Type modifié Gokan OzcifciMVP lundi 3 décembre 2012 07:29
    vendredi 7 septembre 2012 08:46

Toutes les réponses

  • Bonjour,

    Tout d'abord, les sujets sur le développement SharePoint sont à poster ici . Si un modérateur passe dans le coin, peut-il déplacer ce thread?

    Pour répondre à ta question, tu peux passer par un eventReceiver et faire le déplacement d'item lorsqu'un élément est ajouté (attention il faut tester que cet élément ne soit pas un dossier). voilà un bout de code qui fonctionne (à adapter à ton besoin, et à finaliser pour la gestion d'erreur).

    L'astuce à connaître est le formatage de l'url d'un Item. Il est constitué lists/ + nom de la liste + des répertoires éventuels + ID de l'élément + _.000 

    Source  : http://blog.nftinside.com/post/2009/03/11/Deplacement-d-un-SPListItem-dans-un-repertoire-d-une-SPList

    public override void ItemAdded(SPItemEventProperties properties)
    {
     if (properties.ListItem.FileSystemObjectType == SPFileSystemObjectType.File)
     {
         if (properties.ListItem.Name.Contains("Outlook"))
               {
                   var file = properties.ListItem.Web.GetFile(properties.ListItem.Url);
                   var newFilePath = string.Format("{0}/{1}{2}_.000", properties.ListItem.ParentList.RootFolder.Url, "Outlook/", properties.ListItem.ID);
                   file.MoveTo(newFilePath);
               }
               base.ItemAdded(properties);
        }
     }
    }
    NicoBzh



    vendredi 7 septembre 2012 09:52
  • Bonjour,

    Merci de votre réponse.

    Est-il possible de remplacer :

    properties.ListItem.Name.Contains("Outlook")

    par

    properties.ListItem.Name.Contains(Folder) ?

    En fait je veux rendre cela automatique... qu'il compare le fichier a chaque dossier et qu'il le place dans le bon!

    vendredi 7 septembre 2012 13:34
  • Il s'agit qu'un exemple de code permettant de déplacement un élément dans un répertoire donné.

    Il reste à l'adapter au besoin et de le rendre le plus générique possible .... Mais ce n'est plus du développement spécifique à SharePoint...

    NicoBzh

    vendredi 7 septembre 2012 13:37
  • Je comprends bien,

    Je vais devoir trouver comment! Vu les dossiers vont être créés à la main et non connu à l'avance..

    Merci.

    vendredi 7 septembre 2012 13:44
  • Juste une question sur le dév : vu que je débute sous sharepoint et c#

    comment résoudre ces erreurs?

    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Collections;
    using System.Drawing;
    using System.Linq;
    using System.Workflow.ComponentModel.Compiler;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.Runtime;
    using System.Workflow.Activities;
    using System.Workflow.Activities.Rules;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Workflow;
    using Microsoft.SharePoint.WorkflowActions;
    namespace WF_BDC.Workflow1
    {
        public sealed partial class Workflow1 : StateMachineWorkflowActivity
        {
            public Workflow1()
            {
                InitializeComponent();
            }
            public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();
            private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
            {
                SPSite SiteCollection = SPContext.Current.Site;
                
                SPWeb site = SiteCollection.AllWebs["http://test-sharepoint"];
                SPList Liste = site.Lists["Base de Connaissances"];
               
                SPListItemCollection collListItems = Liste.Items;
                SPListItemCollection collFolder = Liste.Folders;
                SPQuery RequeteFichier = new SPQuery();
                 throw new NotImplementedException();
            }
            public override void ItemAdded(SPItemEventProperties properties)
            {
                if (properties.ListItem.FileSystemObjectType == SPFileSystemObjectType.File)
                {
                    if (properties.ListItem.Name.Contains("Outlook"))
                    {
                        var file = properties.ListItem.Web.GetFile(properties.ListItem.Url);
                        var newFilePath = string.Format("{0}/{1}{2}_.000", properties.ListItem.ParentList.RootFolder.Url, "Outlook/", properties.ListItem.ID);
                        file.MoveTo(newFilePath);
                    }
                }
            }
     
            }
     
    }
     

    Erreur 2 'WF_BDC.Workflow1.Workflow1.ItemAdded(Microsoft.SharePoint.SPItemEventProperties)' est un nouveau membre virtuel dans une classe sealed 'WF_BDC.Workflow1.Workflow1' c:\Users\Administrateur.ISGROUPE\Documents\Visual Studio 2010\Projects\WF BDC\WF BDC\Workflow1\Workflow1.cs 46 30 
    Erreur 1 'WF_BDC.Workflow1.Workflow1.ItemAdded(Microsoft.SharePoint.SPItemEventProperties)' : aucune méthode appropriée n'a été trouvée pour la substitution c:\Users\Administrateur.ISGROUPE\Documents\Visual Studio 2010\Projects\WF BDC\WF BDC\Workflow1\Workflow1.cs 46 30 

    vendredi 7 septembre 2012 14:20
  • Pour l'erreur je ne sais pas... Mais dans ma réponse précédente j'ai parlé d'event REceiver et pas de Workflow (même si via un WF on pourrait peut-être s'en sortire... quoique...).

    Un peu de lecture sur le développement d'event Receiver à l'aide de Visual Studio.

    http://www.areaprog.com/SP2010/cours-511-event-receiver-d%27element-developpement-d%27event-handler-au-niveau-des-elements

    Bon courage

    NicoBzh

    vendredi 7 septembre 2012 14:25
  • Bonjour,

    Utilises tu SharePoint 2010?

    Dans ce cas l'organisateur de contenu par défaut pourrait etre utile :


    Cordialement/Regards,

    Ludovic Caffin
    .NET/SharePoint Consultant for A3IS.

    lundi 10 septembre 2012 10:03
  • Bonjour Ludovic,

    Nous avons déjà essayer d'aider Dlautard en le dirigeant vers le Content Organizer mais sans succès... Si tu as un retour d'expérience là dessus n'hésite surtout pas ;-)

    Pour ma part je vais vraiment essayer de trouver un peu de temps pour reproduire le flux sur mon environnement car la question est ouverte depuis bien trop longtemps à mon goût ;-)

    Cordialement,


    Pascal P
    http://sharepoint-afterwork.fr
    Twitter: @PascalPoeck
    Facebook : https://www.facebook.com/SharePointAfterWork

    lundi 10 septembre 2012 19:32
  • bonjour

    Si les noms des dossiers ne sont pas connus à l'avance le content organizer ça va etre compliqué. Effectivement on peut écrire une règle de type "contient" mais il faut toutes les ecrire à l'avance donc ça risque d'etre pénible :)

    Dlautard -> vous avez manifestement collé le code de l'event receiver dans une classe de type workflow. ça peut pas marcher ! :) Voyez l'article proposé par NicoBzh

    Sinon pour "compléter" le code proposé je verrais bien un truc dans ce style : 

     public override void ItemAdded(SPItemEventProperties properties)
            {
    SPListItemCollection colFolders = properties.List.Folders;
    
                if (properties.ListItem.FileSystemObjectType == SPFileSystemObjectType.File)
                {
    
                  foreach(SPListItem folder in colFolders)
                  {
                    if (properties.ListItem.Name.Contains(folder.Name))
                    {
                        var file = properties.ListItem.Web.GetFile(properties.ListItem.Url);
                        var newFilePath = string.Format("{0}/{1}{2}_.000", properties.ListItem.ParentList.RootFolder.Url, "Outlook/", properties.ListItem.ID);
                        file.MoveTo(newFilePath);
    
                        break;
                    }
                  }
                }
            }
    Et encore que faire un parcours un à un des dossiers c'est un peu contre performant, on doit surement pouvoir faire une SPQuery pour chaque "mot" du nom du fichier pour voir si il existe un dossier avec ce nom :)


    Blog Sharepoint : www.paslatek.net Twitter : @LimozinLionel


    samedi 15 septembre 2012 20:58
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale » parce que vous n’êtes pas revenu avec les informations sollicitées. Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires.

    Merci !

    Cordialement,


    Gokan Ozcifci
    SharePoint Community Expert

    vendredi 19 octobre 2012 11:29
  • Bonjour,

    J'utilise sharepoint 2010.

    Grâce à votre aide et celui du forum US j'ai pu avancer. Cependant, lorsque je crée un dossier, il se supprime automatiquement. ( il ne fait pas de distinctions entre fichiers et folders).

     private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
            {
                
                SPWeb web = this.workflowProperties.Web;
                try
                {
                  
    
                    SPList Liste = web.Lists["Base de Connaissances"];
                    SPListItemCollection collFolder = Liste.Folders;
    
        
    
                        foreach (SPFolder folder in Liste.RootFolder.SubFolders)
                        {
    
    
    
    
    
                            // au lieu de regarder le nom de chaque item, on regarde le nom des dossiers qui contient l'élément qui a déclenché l'évènement
                            if (this.workflowProperties.Item.Title.Contains(folder.Name))
                            {
    
    
                                //  DisabledItemEventsScope pour supprimer automatiquement un item.
                                using (DisabledItemEventsScope scope = new DisabledItemEventsScope())
                                {
                                    SPListItem listItem = Liste.Items.Add(folder.ServerRelativeUrl, SPFileSystemObjectType.File);
    
                                    // les champs que l'on veut déplacer
                                    listItem["Base sur"] = this.workflowProperties.Item["Base sur"];
                                    listItem["Description"] = this.workflowProperties.Item["Description"];
                                    listItem["Résolu Comment"] = this.workflowProperties.Item["Résolu Comment"];
    
                                    listItem.Update();
    
                                    //on supprime l'item original vu qu'il a été déplacé.
                                   
                                       this.workflowProperties.Item.Delete();
                                    
    
    
    
                                }
    
                            }
    
    
    
                        }
                    }
                
    
    
                catch (Exception ex)
                {
    
                }
            }
    
    
    
            
        }
    
        class DisabledItemEventsScope : SPItemEventReceiver, IDisposable
            {
                bool AncienneValeur;
                public DisabledItemEventsScope()
                {
                    this.AncienneValeur = base.EventFiringEnabled;
                    base.EventFiringEnabled = false;
    
                }
    
                #region IDisposable Members
                public void Dispose()
                {
                    base.EventFiringEnabled = AncienneValeur;
                }
                #endregion
            }
            }

    mardi 20 novembre 2012 10:09
  • J'ai réussi finalement à déplacer un fichier dans un dossier contenant le nom du fichier.  Il ne me reste plus qu'à faire la récursivité sur les dossiers..

    Cependant, pour déplacer le fichier je ne peux le faire qu'avec le rootFolder, est-ce normal?

    mardi 20 novembre 2012 14:32
  • Bonjour Dlautard ,

    Que veux tu dire par "je ne peux le faire qu'avec le rootFolder"? Peux tu préciser s'il te plait?


    Cordialement/Regards,

    Ludovic Caffin
    .NET/SharePoint Consultant for A3IS.

    lundi 26 novembre 2012 10:14