フォームのカスタム コントロールを作成する

リスト アイテム フォームをカスタマイズするには、既定の Windows SharePoint Services サーバー コントロールを拡張して独自のカスタム コントロールを定義してから、カスタム コントロールを参照するカスタム テンプレートで既存の既定のフォーム テンプレートをオーバーライドします。カスタム クラスを定義するクラス ライブラリを作成し、プロジェクトの DLL をグローバル アセンブリ キャッシュ (GAC) にコピーしてから、DLL を参照するカスタム コントロール テンプレート定義を含む .ascx ファイルを ローカル ドライブ:\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES に追加できます。

ListFieldIterator コントロール

Microsoft.SharePoint.WebControls.ListFieldIterator コントロールは、フォーム内に表示するためにアイテム フィールドを列挙するために使用されます。このコントロールは、\CONTROLTEMPLATES\DefaultTemplates.ascx に定義されている一連のネストしたコントロール テンプレートを通じてリスト アイテム フォームに挿入されます。DocumentLibraryForm テンプレートはフォームのツールバー コントロールとリンクをレイアウトしますが、このテンプレートは、DocumentLibraryFields コントロールを挿入する DocumentLibraryFormCore テンプレートも挿入します。DocumentLibraryFields コントロールの既定のテンプレートは FileFormFields です。これは、ListFieldIterator を挿入する DefaultTemplates.ascx で定義されたコントロールです。

次の例では、ListFieldIterator クラスを拡張するカスタム リスト フィールド反復子コントロールを定義し、その IsFieldExcluded メソッドをオーバーライドします。例では、ユーザーがサイト管理者でない限り、特定のグループのメンバであるユーザーに対してドキュメント ライブラリ フォームの特定のフィールドが表示されないようにします。

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.WebControls

Namespace CustomOverrideControls

   Public Class CustomListFieldIterator
      Inherits ListFieldIterator
      
      Protected Overrides Function IsFieldExcluded(field As SPField) As Boolean
         Dim site As SPWeb = SPContext.Current.Web
         Dim groupId As Integer = site.Groups("ExcludeGroup").ID
         
         If site.IsCurrentUserMemberOfGroup(groupId) AndAlso field.Title = "MySpecialColumn" AndAlso site.CurrentUser.IsSiteAdmin = False Then
            Return True
         End If
         Return MyBase.IsFieldExcluded(field)
      End Function 'IsFieldExcluded
   End Class 'CustomListFieldIterator
End Namespace 'CustomOverrideControls
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace CustomOverrideControls
{
   public class CustomListFieldIterator : ListFieldIterator
   {
      protected override bool IsFieldExcluded(SPField field)
      {
         SPWeb site = SPContext.Current.Web;
         int groupId = site.Groups["ExcludeGroup"].ID;

         if (site.IsCurrentUserMemberOfGroup(groupId) && field.Title == "MySpecialColumn" && site.CurrentUser.IsSiteAdmin == false)
         {
            return true;
         }
         return base.IsFieldExcluded(field);
      }
   }
}

リスト フィールド反復子を拡張するカスタム コントロールを作成するには

  1. Microsoft Visual Studio 2005 で、[ファイル] をクリックし、[新規作成] をポイントしてから [プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ボックスでプロジェクトの言語を選択し、[テンプレート] ボックスで [ クラス ライブラリ] を選択してプロジェクトを構築するための名前と場所を入力し、[OK] をクリックします。

  3. Microsoft.SharePoint アセンブリへの参照を追加するには、ソリューション エクスプローラでプロジェクトを右クリックし、[参照の追加] ダイアログ ボックスの [.NET] タブで [Windows SharePoint Services] を選択し、[OK] をクリックします。

  4. プロジェクトの作成時にカスタム アセンブリに厳密な名前を付けるには、ソリューション エクスプローラで [プロパティ] を右クリックし、[署名]、[アセンブリの署名] の順に選択して、厳密な名前のキー ファイル名を指定します。

  5. ソリューション エクスプローラでプロジェクトの .cs または .vb ファイルをダブルクリックし、前の例のようなコードを追加して、Windows SharePoint Services コントロールを拡張するカスタム コントロールのクラスを定義します。

  6. Ctrl + Shift + B キーを押してソリューションをビルドします。

  7. Windows エクスプローラで、プロジェクト フォルダから GAC に DLL をドラッグします。

カスタム フォーム コントロールを実装するには、既定のテンプレートをオーバーライドするコントロール テンプレートを含む .ascx ファイルを作成して、フォーム ページにカスタム コントロールを挿入する必要があります。

次の例では、フォームに対して 3 つのネストしたカスタム テンプレートを定義します。最初のテンプレートは、DocumentLibraryForm テンプレートをオーバーライドして 2 番目のテンプレート CustomDocumentLibraryFormCore への参照を作成します。2 番目のテンプレートは、3 番目のテンプレート CustomFileFormFields を DocumentLibraryFields コントロールの定義テンプレートとして指定します。3 番目のテンプレートは、前の例のようにクラス ライブラリに定義できるカスタム リスト フィールド反復子を挿入します。

<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
  <Template>
    <SharePoint:InformationBar runat="server"/>
    <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&nbsp;" runat="server">
      <Template_RightButtons>
        <SharePoint:SaveButton TabIndex=1 runat="server"/>
        <SharePoint:GoBackButton runat="server"/>
      </Template_RightButtons>
    </wssuc:ToolBar>
    <SharePoint:FormToolBar runat="server"/>
    <SharePoint:FormComponent TemplateName="CustomDocumentLibraryFormCore" runat="server"/>
  </Template>
</SharePoint:RenderingTemplate>

<SharePoint:RenderingTemplate ID="CustomDocumentLibraryFormCore" runat="server">
  <Template>
    <TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 id="formTbl" cellspacing=0 width=100%>
      <SharePoint:ChangeContentType runat="server"/>
      <SharePoint:DocumentLibraryFields TemplateName="CustomFileFormFields" runat="server"/>
      <SharePoint:ApprovalStatus runat="server"/>
    </TABLE>


    <SharePoint:WebPartPageMaintenanceMessage runat="server"/>
    <SharePoint:DocumentTransformersInfo runat="server"/>
    <table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline">
      <IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt="">   
    </td></tr></table>
    <TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px">
    <tr><td width=100%>
    <SharePoint:ItemHiddenVersion runat="server"/>
    <SharePoint:InitContentType runat="server"/>
    <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
      <Template_Buttons>
        <SharePoint:CreatedModifiedInfo runat="server"/>
      </Template_Buttons>
      <Template_RightButtons>
        <SharePoint:SaveButton runat="server"/>
        <SharePoint:GoBackButton runat="server"/>
      </Template_RightButtons>
    </wssuc:ToolBar>
    </td></tr></TABLE>
  </Template>
</SharePoint:RenderingTemplate>

<SharePoint:RenderingTemplate ID="CustomFileFormFields" runat="server">
  <Template>
    <CustomOverrideControls:CustomListFieldIterator runat="server"/>
  </Template>
</SharePoint:RenderingTemplate>

ドキュメント ライブラリのカスタム コントロール テンプレート ファイルを作成するには

  1. テキスト エディタで、必要なディレクティブを含む .ascx ファイルを \12\TEMPLATE\CONTROLTEMPLATES に作成します。前の例では、カスタム コントロールのアセンブリと名前空間を登録するために次のようなディレクティブが必要です。

    <%@ Control Language="C#"   %>
    <%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%>
    <%@ Register TagPrefix="wssuc" TagName="ToolBar" src="/_controltemplates/ToolBar.ascx" %>
    <%@ Register TagPrefix="wssuc" TagName="ToolBarButton" src="/_controltemplates/ToolBarButton.ascx" %>
    <%@Assembly Name="CustomOverrideControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b23bfc50a92c9e0d" %>
    <%@Register TagPrefix="CustomOverrideControls" Assembly="CustomOverrideControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b23bfc50a92c9e0d" namespace="CustomOverrideControls"%>
    
  2. 前の例のような、特定の既定のコントロール テンプレートをオーバーライドするテンプレート定義を .ascx ファイルに追加します。

  3. 変更を有効にするために、Internet Information Services (IIS) をリセットします。

  4. 前の例をテストするには、ユーザー インターフェイスを使用してタイトルが "z" で始まるフィールドを作成し、ドキュメント ライブラリ内のアイテムのフォームに移動して変更を確認します。