カスタム フォーム テンプレートを作成する

最終更新日: 2010年9月22日

適用対象: SharePoint Foundation 2010

%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES\ の DefaultTemplates.ascx ファイルで定義されている Microsoft ASP.NET コントロール テンプレートは、Microsoft SharePoint Foundation 2010 リスト アイテム フォームのレイアウトを決定します。これらのテンプレートは、フォーム レイアウト定義に他のコントロール テンプレートを使用するコントロールをネストできます。コントロールには HTML マークアップと Web コントロールを含めることができますが、<%#...%> 構文を含むデータ バインドされたステートメントを含めることはできません。フロントエンド Web サーバーで既定のコントロール テンプレートをグローバルにオーバーライドするには、DefaultTemplates.ascx ファイル内の既存のコントロール テンプレートの ID と一致するコントロール テンプレート識別子 (ID) を持つカスタム .ascx ファイルを \CONTROLTEMPLATES ディレクトリに追加します。Microsoft Visual Studio でユーザー コントロールを作成する方法については、「How to: Create a User Control for a SharePoint Application Page or Web Part」を参照してください。

カスタム テンプレートを作成する

既定のテンプレートのオーバーライドに加えて、独自のカスタム フォーム テンプレートを作成し、リスト タイプまたはコンテンツ タイプによって参照できます。カスタム フォーム テンプレートをリスト タイプによって登録するには、リスト定義の Schema.xml ファイルで <Form> タグの Template 属性を使用してフォーム テンプレートの名前を指定します。次に例を示します。

<Forms>
  <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
  <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
  <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
</Forms>

次の例では、2 つの追加カスタム フォームを定義しています。

<Forms>
  <Form 
    Type="DisplayForm" 
    Url="DispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" Default="FALSE"/>
  <Form 
    Type="DisplayForm" 
    Url="MyDispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" 
    UseDefaultListFormWebPart="False" 
    Default="TRUE">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly
          <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
          <PageType>PAGE_DISPLAYFORM</PageType>
        </WebPart>]]>
      </AllUsersWebPart>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
          <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
          <PageType>PAGE_VIEW</PageType>
          <ViewFlags>Hidden ReadOnly Html</ViewFlags>
        </WebPart>]]>
      </AllUsersWebPart>
    </WebParts>
  </Form>
  <Form 
    Type="EditForm" 
    Url="EditForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" />
  <Form
    Type="EditForm"
    Url="MyEditForm.aspx"
    SetupPath="pages\form.aspx"
    WebPartZoneID="Main"
    Default="TRUE"
    UseDefaultListFormWebPart="False"
    WebPartOrder="1">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>                         
           <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
           <PageType>PAGE_VIEW</PageType>
           <ViewFlags>Hidden ReadOnly Html</ViewFlags>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="2"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2" xmlns:iwp="https://schemas.microsoft.com/WebPart/v2/Image">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
           <TypeName>Microsoft.SharePoint.WebPartPages.ImageWebPart</TypeName>
           <FrameType>None</FrameType>
           <Title>Site Image</Title>
           <iwp:ImageLink>/_layouts/images/homepage.gif</iwp:ImageLink>
           <iwp:AlternativeText>Logo</iwp:AlternativeText>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>            
           <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
           <PageType>PAGE_EDITFORM</PageType>
         </WebPart>]]>
       </AllUsersWebPart>
       <View BaseViewID="1" WebPartZoneID="Main" WebPartOrder="4" />
     </WebParts>
   </Form>
   <Form 
     Type="NewForm" 
     Url="NewForm.aspx" 
     SetupPath="pages\form.aspx" 
     WebPartZoneID="Main" />
</Forms>

カスタム フォーム テンプレートをコンテンツ タイプによって登録するには、機能のElements.xml ファイルで <ContentType> タグの子として次のような定義を追加します。

<XmlDocuments>
  <XmlDocument NamespaceURI="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
    <FormTemplates  xmlns="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
      <Display>MyCustomForm</Display>
      <Edit>MyCustomForm</Edit>
      <New>MyCustomForm</New>
    </FormTemplates>
  </XmlDocument>
</XmlDocuments>

前の例の "MyCustomForm"は、\CONTROLTEMPLATES ディレクトリに追加するカスタム コントロール テンプレートの ID です。

テンプレートの構造

ASCX ベースのコントロール テンプレートは、複数のコントロールをネストされた構造にまとめます。この構造では、コントロール自体がテンプレートから構成されます。この構造は、より充実したリスト アイテム フォームに使用できます。

%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES で定義されているドキュメント ライブラリ フォーム テンプレートは、コントロール テンプレート構造の優れた例を提供しています。次の例に、ドキュメント ライブラリ フォームに対して定義されている既定のコントロール テンプレートを示します。

<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 runat="server"/>
          <SharePoint:GoBackButton runat="server"/>
        </Template_RightButtons>
      </wssuc:ToolBar>
    <SharePoint:FormToolBar runat="server"/>
    <SharePoint:FormComponent TemplateName="DocumentLibraryFormCore" runat="server"/>
  </Template>
</SharePoint:RenderingTemplate>

この例では、ドキュメント ライブラリ フォーム テンプレートが複数のコンポーネントを描画して完全なフォーム テンプレートをレイアウトします。これらのコンポーネントの多くは、Microsoft.SharePoint.WebControls.TemplateBasedControl から派生する Microsoft.SharePoint.WebControls.FormComponent 基本クラスから派生し、コンポーネントが自身をテンプレートに挿入できることを意味します。

ただし、ほとんどのフォームは、実際には ID が DocumentLibraryFormCore である DefaultTemplates.ascx で定義された別のテンプレートを使用してレンダリングされます。このテンプレートは、次の例に示すように、ページ レイアウトを編成するのに役立つテーブルベースの HTML 構造など、さまざまなコンポーネントから構成されます。

<SharePoint:RenderingTemplate ID="DocumentLibraryFormCore" 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 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>

この例の DocumentLibraryFormCore テンプレート内の重要なコンポーネントは、Microsoft.SharePoint.WebControls.ListFieldIterator クラスから派生した Microsoft.SharePoint.WebControls.DocumentLibraryFields コントロールを参照する DocumentLibraryFields コンポーネントです。リスト フィールド反復子には、フィールドを表形式でレイアウトするためのロジックが含まれます。ただし、ListFieldIterator クラスは、テンプレートでオーバーライドされていない場合にのみコントロールをレンダリングします。したがって、特定のフィールドのフィールド コントロール (たとえば、右上にタイトル フィールド コントロールを挿入し、その下に作成者フィールド コントロールを挿入するコントロール) を追加した場合、反復子はコントロールをレイアウトしません。代わりに、ListFieldIterator クラスから派生する独自のリスト フィールド反復子を指定し、フィールド反復を行うカスタム ロジックを提供することも選択できます。

DocumentLibraryForm テンプレートをオーバーライドし、別の DocumentLibraryFormCore テンプレート指定できます。さらに、そこからフォーム テンプレートをカスタマイズし、既存のコントロールを指定するか、アセンブリまたは .ascx ファイルで定義されている他のカスタム コントロールへの参照を追加できます。

重要重要

SharePoint Foundation よってフロントエンド Web サーバーにインストールされた Default.ascx ファイルの編集はサポートされていません。もともとインストールされているファイルに対する変更は、SharePoint Foundation の更新やサービス パックをインストールしたり、インストールを次の製品バージョンにアップグレードしたりすると、上書きされる可能性があります。