次の方法で共有


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

最終更新日: 2010年7月7日

適用対象: SharePoint Foundation 2010

この記事の内容
ListFieldIterator コントロール

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

ListFieldIterator コントロール

Microsoft.SharePoint.WebControls.ListFieldIterator コントロールは、フォーム内での表示用にアイテム フィールドを列挙するために使用されます。このコントロールは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\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 で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

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

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

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

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

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

  7. グローバル アセンブリ キャッシュ (GAC) にプロジェクト DLL をコピーするには、gacutil.exe を使用します。これは Microsoft .NET Framework 2.0 ソフトウェア開発キットとともにインストールされるコマンド ライン ユーティリティです。コマンド プロンプトで次のコマンドを入力します。gacutil.exe -if "<Full file system path to 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. 「How to: Create a User Control for a SharePoint Application Page or Web Part (英語)」で説明しているように、SharePoint プロジェクトでユーザー コントロールを作成します。プロジェクトを展開するとき、Visual Studio は, .ascx ファイルを含む %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\CONTROLTEMPLATES ディレクトリにプロジェクト サブフォルダーを作成します。

  2. 前の例のような、特定の既定のコントロール テンプレートをオーバーライドするテンプレート定義を .ascx ファイルに追加します。

  3. インターネット インフォメーション サービス (IIS) をリセットして、変更内容を有効にします。

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