サーバー エクスプローラーの [SharePoint 接続] ノードにノードを拡張できます。 これは、新しい子ノード、ショートカット メニュー項目、またはプロパティを既存のノードに追加するのに役立ちます。 詳細については、「サーバー エクスプローラーの [SharePoint 接続] ノードの拡張」を参照してください。
サーバー エクスプローラーの SharePoint ノードを拡張するには
クラス ライブラリ プロジェクトを作成します。
次のアセンブリへの参照を追加します。
Microsoft.VisualStudio.SharePoint
Microsoft.VisualStudio.SharePoint.Explorer.Extensions
System.ComponentModel.Composition
IExplorerNodeTypeExtension インターフェイスを実装するクラスを作成します。
クラスに System.ComponentModel.Composition.ExportAttribute 属性を追加します。 この属性によって、Visual Studio で IExplorerNodeTypeExtension の実装を検出し、読み込むことができます。 この属性のコンストラクターには IExplorerNodeTypeExtension 型を渡します。
クラスに ExplorerNodeTypeAttribute 属性を追加します。 この属性によって、拡張するノードの種類の文字列識別子が指定されます。
Visual Studio に用意されている組み込みのノード型を指定するには、この属性のコンストラクターに次のいずれかの列挙値を渡します。
ExplorerNodeTypes: これらの値を使用して、サーバー エクスプローラーのサイト接続ノード (サイトの URL を表示するノード)、サイト ノード、またはその他のすべての親ノードを指定します。
ExtensionNodeTypes: これらの値を使用して、リスト、フィールド、コンテンツの種類を表すノードなど、SharePoint サイトの個々のコンポーネントを表す組み込みのノードの 1 つを指定します。
IExplorerNodeTypeExtension.Initialize メソッドの実装では、nodeType パラメーターのメンバーを使用して、機能をノードに追加します。 このパラメーターは、IExplorerNodeEvents インターフェイスに定義されているイベントにアクセスできるようにする IExplorerNodeType オブジェクトです。 たとえば、次のイベントを処理できます。
IExplorerNodeEvents.NodeChildrenRequested: このイベントを処理して、新しい子ノードをノードに追加します。 詳細については、「方法: サーバー エクスプローラーにカスタム SharePoint ノードを追加する」を参照してください。
IExplorerNodeEvents.NodeMenuItemsRequested: このイベントを処理して、カスタム ショートカット メニュー項目をノードに追加します。
IExplorerNodeEvents.NodePropertiesRequested: このイベントを処理して、カスタム プロパティをノードに追加します。 ノードを選択すると、追加したプロパティが [プロパティ] ウィンドウに表示されます。
例
次のコード例は、2 種類のノードの拡張機能を作成する方法を示します。
コンテキスト メニュー項目を SharePoint サイト ノードに追加する拡張機能 メニュー項目をクリックすると、クリックしたノードの名前が表示されます。
ContosoExampleProperty という名前のカスタム プロパティを Body という名前のフィールドを表す各ノードに追加する拡張機能
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);
}
}
}
}
}
この拡張機能によって、編集可能な文字列プロパティがノードに追加されます。 また、SharePoint サーバーから読み取り専用データを表示するカスタム プロパティを作成することもできます。 この方法を示す例については、「チュートリアル: サーバー エクスプローラーを拡張して Web パーツを表示する」を参照してください。
コードのコンパイル
この例は、次のアセンブリへの参照を必要とします。
Microsoft.VisualStudio.SharePoint
Microsoft.VisualStudio.SharePoint.Explorer.Extensions
System.ComponentModel.Composition
System.Windows.Forms
拡張機能の配置
サーバー エクスプローラーの拡張機能を配置するには、同梱する必要のあるアセンブリや各種ファイルの Visual Studio Extension (VSIX) パッケージを作成します。 詳細については、「Visual Studio での SharePoint ツールの拡張機能の配置」を参照してください。
参照
処理手順
方法: サーバー エクスプローラーにカスタム SharePoint ノードを追加する
概念
サーバー エクスプローラーの [SharePoint 接続] ノードの拡張