Share via


Comment : étendre un nœud SharePoint dans l'Explorateur de serveurs

Il est possible d'étendre des nœuds sous le nœud Connexions SharePoint dans l'Explorateur de serveurs.Cela est utile lorsque vous souhaitez ajouter de nouveaux nœuds enfants, éléments de menu contextuel ou propriétés à un nœud existant.Pour plus d'informations, consultez Extension du nœud Connexions SharePoint dans l'Explorateur de serveurs.

Pour étendre un nœud SharePoint dans l'Explorateur de serveurs

  1. Créez un projet Bibliothèque de classes.

  2. Ajoutez des références aux assemblys suivants :

    • Microsoft.VisualStudio.SharePoint

    • Microsoft.VisualStudio.SharePoint.Explorer.Extensions

    • System.ComponentModel.Composition

  3. Créez une classe qui implémente l'interface IExplorerNodeTypeExtension.

  4. Ajoutez l'attribut System.ComponentModel.Composition.ExportAttribute à la classe.Cet attribut permet à Visual Studio de découvrir et de charger votre implémentation IExplorerNodeTypeExtension.Passez le type IExplorerNodeTypeExtension au constructeur d'attribut.

  5. Ajoutez l'attribut ExplorerNodeTypeAttribute à la classe.Cet attribut spécifie l'identificateur de chaîne pour le type de nœud que vous souhaitez étendre.

    Pour spécifier les types de nœuds intégrés fournis par Visual Studio, passez l'une des valeurs d'énumération suivantes au constructeur d'attribut :

    • ExplorerNodeTypes : utilisez ces valeurs pour spécifier des nœuds de connexion de site (nœuds qui affichent les URL de site), des nœuds de site ou tous les autres nœuds parents de l'Explorateur de serveurs.

    • ExtensionNodeTypes : Utilisez ces valeurs pour spécifier l'un des nœuds intégrés qui représentent un composant individuel sur un site SharePoint, tel qu'un nœud qui représente une liste, un champ ou un type de contenu.

  6. Dans votre implémentation de la méthode IExplorerNodeTypeExtension.Initialize, utilisez les membres du paramètre nodeType pour ajouter des fonctionnalités au nœud.Ce paramètre est un objet IExplorerNodeType qui fournit l'accès aux événements définis dans l'interface IExplorerNodeEvents.Par exemple, il est possible de gérer les événements suivants :

Exemple

L'exemple de code suivant montre comment créer deux types différents d'extensions de nœud :

  • Une extension qui ajoute un élément de menu contextuel aux nœuds de site SharePoint.Lorsque vous cliquez sur l'élément de menu, il affiche le nom du nœud sur lequel vous avez cliqué.

  • Une extension qui ajoute une propriété personnalisée nommée ContosoExampleProperty à chaque nœud qui représente un champ nommé Corps.

Imports System.ComponentModel
Imports System.ComponentModel.Composition
Imports System.Windows.Forms
Imports Microsoft.VisualStudio.SharePoint
Imports Microsoft.VisualStudio.SharePoint.Explorer
Imports Microsoft.VisualStudio.SharePoint.Explorer.Extensions

Namespace Contoso.ServerExplorerExtension
    <Export(GetType(IExplorerNodeTypeExtension))> _
    <ExplorerNodeType(ExplorerNodeTypes.SiteNode)> _
    Friend Class SiteNodeExtensionWithContextMenu
        Implements IExplorerNodeTypeExtension

        Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _
            Implements IExplorerNodeTypeExtension.Initialize
            AddHandler nodeType.NodeMenuItemsRequested, AddressOf NodeMenuItemsRequested
        End Sub

        Private Sub NodeMenuItemsRequested(ByVal Sender As Object, ByVal e As ExplorerNodeMenuItemsRequestedEventArgs)
            Dim menuItem = e.MenuItems.Add("Display Message")
            AddHandler menuItem.Click, AddressOf MenuItemClick
        End Sub

        Private Sub MenuItemClick(ByVal Sender As Object, ByVal e As MenuItemEventArgs)
            Dim node As IExplorerNode = CType(e.Owner, IExplorerNode)
            MessageBox.Show(String.Format("Clicked the menu item for the '{0}' node.", node.Text))
        End Sub
    End Class

    <Export(GetType(IExplorerNodeTypeExtension))> _
    <ExplorerNodeType(ExtensionNodeTypes.FieldNode)> _
    Friend Class FieldNodeExtensionWithProperty
        Implements IExplorerNodeTypeExtension

        Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _
            Implements IExplorerNodeTypeExtension.Initialize
            AddHandler nodeType.NodePropertiesRequested, AddressOf NodePropertiesRequested
        End Sub

        Private Sub NodePropertiesRequested(ByVal Sender As Object, ByVal e As ExplorerNodePropertiesRequestedEventArgs)
            Dim propertyObject As ExampleProperty = Nothing

            ' Only add the property to "Body" fields.
            If e.Node.Text = "Body" Then
                ' If the properties object already exists for this node, get it from the node's annotations.
                If False = e.Node.Annotations.TryGetValue(propertyObject) Then
                    ' Otherwise, create a new properties object and add it to the annotations.
                    propertyObject = New ExampleProperty(e.Node)
                    e.Node.Annotations.Add(propertyObject)
                End If
                e.PropertySources.Add(propertyObject)
            End If
        End Sub
    End Class

    Friend Class ExampleProperty

        Private node As IExplorerNode
        Private Const propertyId As String = "Contoso.CustomActionTestProperty"
        Private Const propertyDefaultValue As String = "This is a test value."

        Friend Sub New(ByVal node As IExplorerNode)
            Me.node = node
        End Sub

        ' Gets or sets a simple string property. 
        <DisplayName("ContosoExampleProperty")> _
        <DescriptionAttribute("This is an example property for field nodes.")> _
        <DefaultValue(propertyDefaultValue)> _
        Public Property TestProperty As String
            Get
                Dim propertyValue As String = Nothing

                ' Get the current property value if it already exists; otherwise, return a default value.
                If False = node.Annotations.TryGetValue(propertyId, propertyValue) Then
                    propertyValue = propertyDefaultValue
                End If
                Return propertyValue
            End Get
            Set(ByVal value As String)
                If value <> propertyDefaultValue Then
                    ' Store the property value in the Annotations property of the node. 
                    ' Data in the Annotations property does not persist when Visual Studio exits.
                    node.Annotations(propertyId) = value
                Else
                    ' Do not save the default value.
                    node.Annotations.Values.Remove(propertyId)
                End If
            End Set
        End Property
    End Class
End Namespace
using System.ComponentModel;
using System.ComponentModel.Composition;
using System.Windows.Forms;
using Microsoft.VisualStudio.SharePoint;
using Microsoft.VisualStudio.SharePoint.Explorer;
using Microsoft.VisualStudio.SharePoint.Explorer.Extensions;

namespace Contoso.ServerExplorerExtension
{
    [Export(typeof(IExplorerNodeTypeExtension))]
    [ExplorerNodeType(ExplorerNodeTypes.SiteNode)]
    internal class SiteNodeExtensionWithContextMenu : IExplorerNodeTypeExtension
    {
        public void Initialize(IExplorerNodeType nodeType)
        {
            nodeType.NodeMenuItemsRequested += nodeType_NodeMenuItemsRequested;
        }

        void nodeType_NodeMenuItemsRequested(object sender, ExplorerNodeMenuItemsRequestedEventArgs e)
        {
            IMenuItem menuItem = e.MenuItems.Add("Display Message");
            menuItem.Click += menuItem_Click;
        }

        void menuItem_Click(object sender, MenuItemEventArgs e)
        {
            IExplorerNode node = (IExplorerNode)e.Owner;
            MessageBox.Show(string.Format("Clicked the menu item for the '{0}' node.", node.Text));
        }
    }

    [Export(typeof(IExplorerNodeTypeExtension))]
    [ExplorerNodeType(ExtensionNodeTypes.FieldNode)]
    internal class FieldNodeExtensionWithProperty : IExplorerNodeTypeExtension
    {
        public void Initialize(IExplorerNodeType nodeType)
        {
            nodeType.NodePropertiesRequested += nodeType_NodePropertiesRequested;
        }

        void nodeType_NodePropertiesRequested(object sender, ExplorerNodePropertiesRequestedEventArgs e)
        {
            // Only add the property to "Body" fields.
            if (e.Node.Text == "Body")
            {
                ExampleProperty propertyObject;

                // If the properties object already exists for this node, get it from the node's annotations.
                if (!e.Node.Annotations.TryGetValue(out propertyObject))
                {
                    // Otherwise, create a new properties object and add it to the annotations.
                    propertyObject = new ExampleProperty(e.Node);
                    e.Node.Annotations.Add(propertyObject);
                }

                e.PropertySources.Add(propertyObject);
            }
        }
    }

    internal class ExampleProperty
    {
        private IExplorerNode node;
        private const string propertyId = "Contoso.ExampleProperty";
        private const string propertyDefaultValue = "This is an example property.";

        internal ExampleProperty(IExplorerNode node)
        {
            this.node = node;
        }

        // Gets or sets a simple string property. 
        [DisplayName("ContosoExampleProperty")]
        [DescriptionAttribute("This is an example property for field nodes.")]
        [DefaultValue(propertyDefaultValue)]
        public string TestProperty
        {
            get
            {
                string propertyValue;

                // Get the current property value if it already exists; otherwise, return a default value.
                if (!node.Annotations.TryGetValue(propertyId, out propertyValue))
                {
                    propertyValue = propertyDefaultValue;
                }
                return propertyValue;
            }
            set
            {
                if (value != propertyDefaultValue)
                {
                    // Store the property value in the Annotations property of the node. 
                    // Data in the Annotations property does not persist when Visual Studio exits.
                    node.Annotations[propertyId] = value;
                }
                else
                {
                    // Do not save the default value.
                    node.Annotations.Remove(propertyId);
                }
            }
        }
    }

}

Cette extension ajoute aux nœuds une propriété de type chaîne modifiable.Vous pouvez également créer des propriétés personnalisées qui affichent des données en lecture seule à partir du serveur SharePoint.Pour obtenir un exemple qui illustre cette opération, consultez Procédure pas à pas : extension de l'Explorateur de serveurs pour afficher des WebParts.

Compilation du code

Cet exemple nécessite des références aux assemblys suivants :

  • Microsoft.VisualStudio.SharePoint

  • Microsoft.VisualStudio.SharePoint.Explorer.Extensions

  • System.ComponentModel.Composition

  • System.Windows.Forms

Déploiement de l'extension

Pour déployer l'extension Explorateur de serveurs, créez un package d'extension Visual Studio (VSIX) pour l'assembly et tous les autres fichiers que vous voulez distribuer avec l'extension.Pour plus d'informations, consultez Déploiement d'extensions pour les outils SharePoint dans Visual Studio.

Voir aussi

Tâches

Procédure pas à pas : extension de l'Explorateur de serveurs pour afficher des WebParts

Concepts

Comment : ajouter un nœud SharePoint personnalisé à l'Explorateur de serveurs

Association de données personnalisées à des extensions d'outils SharePoint

Autres ressources

Extension du nœud Connexions SharePoint dans l'Explorateur de serveurs