ユーザー設定フィールド型およびフィールド コントロールを作成する

ユーザー設定フィールド型を作成するには、フィールドを表示するユーザー設定フィールド型およびコントロールを定義し、フィールド型定義を追加してそのフィールド型およびコントロールを登録することによって、既定の Windows SharePoint Services フィールド型を拡張します。フィールド型およびコントロールのカスタム クラスを定義し、プロジェクトの DLL をグローバル アセンブリ キャッシュ (GAC) にコピーして、その DLL を参照する定義を含む XML ファイルを、ローカル ドライブ:\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML に追加できます。

フィールド型およびフィールド コントロール

Microsoft.SharePoint 名前空間に定義された多くのフィールド型は、Microsoft.SharePoint.WebControls 名前空間に定義されたフィールド コントロールに関連付けられます。たとえば、単一行テキストのフィールド型を定義する SPFieldText クラスは、SPFieldText オブジェクトの表示専用の Microsoft.SharePoint.WebControls.TextField クラスに関連付けられています。フィールド型はフィールド インスタンスに固有のメタデータを定義します。フィールド コントロールは、SharePoint リストの 3 つのコントロール モード (New、Display、および Edit) に従ってデータを表示するロジックおよび動作を定義します。フィールド型およびフィールド コントロールのオブジェクト モデルの詳細については、「ユーザー設定フィールド型」を参照してください。

フィールド型のクラスおよびコントロールを定義するには、アセンブリを作成します。クラスおよびアセンブリを登録し、Collaborative Application Markup Language のコア スキーマ で作成した XML ファイルでメタデータおよび表示パターンを指定します。

次の例では、SPFieldText クラスから派生した、会社のロゴを表示するユーザー設定フィールドを定義します。

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

Namespace MS.Samples.SharePoint.CustomFieldType

   Public Class MyCompanyLogoField
      Inherits SPFieldText

      Public Sub New(fields As SPFieldCollection, fieldName As String)
         MyBase.New(fields, fieldName)
      End Sub 'New

      Public Sub New(fields As SPFieldCollection, typeName As String, displayName As String)
         MyBase.New(fields, typeName, displayName)
      End Sub 'New

      Public Overrides ReadOnly Property FieldRenderingControl() As BaseFieldControl
         Get
            Dim fieldControl = New CompanyLogoPickerFieldControl(Me)
            
            fieldControl.FieldName = InternalName
            
            Return fieldControl
         End Get
      End Property
   End Class 'MyCompanyLogoField
End Namespace 'MS.Samples.SharePoint.CustomFieldType
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace MS.Samples.SharePoint.CustomFieldType
{
    public class MyCompanyLogoField : SPFieldText
    {
        public MyCompanyLogoField(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
        {}

        public MyCompanyLogoField(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName)
        {}

        public override BaseFieldControl FieldRenderingControl
        {
            get
            {
                BaseFieldControl fieldControl = new CompanyLogoPickerFieldControl(this);

                fieldControl.FieldName = InternalName;

                return fieldControl;
            }
        }
    }
}

この例では、次の例で定義しているカスタム CompanyLogoPickerFieldControl コンストラクタを呼び出すために、FieldRenderingControl プロパティをオーバーライドします。

次の例では、前述のユーザー設定フィールドを表示するカスタム コントロールを定義しています。この例では CreateChildControls メソッドをオーバーライドし、会社のロゴを選択するためのドロップダウン ListBox および対応するイメージを表示するテーブルを定義しています。

例では会社のロゴに使用するために既定のイメージ ファイル MyDefaultLogo.png を指定していますが、実際にはファイル名およびイメージ ファイルの種類は任意に指定できます。

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.WebControls
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls

Namespace MS.Samples.SharePoint.CustomFieldType

   Public Class CompanyLogoPickerFieldControl
      Inherits TextField
      Private field As MyCompanyLogoField
      Private listBox As ListBox
      Private table As HtmlTable

      Public Sub New(parentField As MyCompanyLogoField)
         Me.field = parentField
         Me.listBox = New ListBox()
      End Sub 'New

      Protected Overrides Sub OnInit(e As EventArgs)
         MyBase.OnInit(e)
      End Sub 'OnInit

      Protected Overrides Sub CreateChildControls()
         MyBase.CreateChildControls()

         Me.table = New HtmlTable()

         Dim row As New HtmlTableRow()
         table.Rows.Add(row)

         Dim cell As HtmlTableCell = Nothing

         If Me.ControlMode = SPControlMode.Edit OrElse Me.ControlMode = SPControlMode.New Then
            cell = New HtmlTableCell()

            cell.ColSpan = 2
            cell.Attributes("class") = "ms-formdescription"
            cell.InnerText = "Choose a logo:"

            row = New HtmlTableRow()
            table.Rows.Add(row)

            cell = New HtmlTableCell()
            row.Cells.Add(cell)

            ' Create a list selector.
            Me.listBox = New ListBox()
            Me.listBox.Rows = 12

            Dim site As SPSite = SPContext.GetContext(Me.Context).Site

            Dim dataSource As New SPDataSource()
            dataSource.List = site.RootWeb.Lists("Logos")

            Me.listBox.DataSource = dataSource
            Me.listBox.DataTextField = "Title"
            Me.listBox.DataValueField = "Name"

            Me.listBox.DataBind()

            ' Get the current value of the field.
            Dim currentValue As String = CStr(Me.ItemFieldValue)

            If Not (currentValue Is Nothing) AndAlso currentValue <> String.Empty Then
               Me.listBox.SelectedValue = currentValue
            ElseIf Me.listBox.Items.Count > 0 Then
               Me.listBox.SelectedIndex = 0
            End If

            ' Add the script which updates the preview image.
            Me.listBox.Attributes("onchange") = "document.all.imgLogoPreview.src = '/logos/' + this.options[this.selectedIndex].value;"
            cell.Controls.Add(Me.listBox)
            row.Cells.Add(cell)
         End If

         cell = New HtmlTableCell()

         Dim literalControl As New LiteralControl()

         Dim logo As String = Nothing
         Dim logoObject As Object = Me.ItemFieldValue

         If Not (logoObject Is Nothing) Then
            logo = CStr(logoObject)
         End If

         If logo Is Nothing OrElse logo = String.Empty Then
            logo = "MyDefaultLogo.png"
         End If

         literalControl.Text = "<img id='imgLogoPreview' src='/logos/" + logo + "'></img>"

         cell.Controls.Add(literalControl)

         row.Cells.Add(cell)

         MyBase.Controls.Add(table)
      End Sub 'CreateChildControls

      Public Overrides Sub UpdateFieldValueInItem()
         Me.EnsureChildControls()

         Try
            Me.Value = Me.listBox.SelectedValue
            Me.ItemFieldValue = Me.Value
         Catch Else
         End Try
      End Sub 'UpdateFieldValueInItem

      Protected Overrides Sub Render(output As HtmlTextWriter)
         Me.table.RenderControl(output)
      End Sub 'Render
   End Class 'CompanyLogoPickerFieldControl
End Namespace 'MS.Samples.SharePoint.CustomFieldType
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace MS.Samples.SharePoint.CustomFieldType
{
    public class CompanyLogoPickerFieldControl : TextField
    {
        private MyCompanyLogoField field;
        private ListBox listBox;
        private HtmlTable table;

        public CompanyLogoPickerFieldControl(MyCompanyLogoField parentField)
        {
            this.field = parentField;
            this.listBox = new ListBox();
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            this.table = new HtmlTable();

            HtmlTableRow row = new HtmlTableRow();
            table.Rows.Add(row);

            HtmlTableCell cell = null;

            if (this.ControlMode == SPControlMode.Edit || this.ControlMode == SPControlMode.New)
            {
                cell = new HtmlTableCell();

                cell.ColSpan = 2;
                cell.Attributes["class"] = "ms-formdescription";
                cell.InnerText = "Choose a logo:";

                row = new HtmlTableRow();
                table.Rows.Add(row);

                cell = new HtmlTableCell();
                row.Cells.Add(cell);

                // Create a list selector.
                this.listBox = new ListBox();
                this.listBox.Rows = 12;

                SPSite site = SPContext.GetContext(this.Context).Site;

                SPDataSource dataSource = new SPDataSource();
                dataSource.List = site.RootWeb.Lists["Logos"];

                this.listBox.DataSource = dataSource;
                this.listBox.DataTextField = "Title";
                this.listBox.DataValueField = "Name";

                this.listBox.DataBind();

                // Get the current value of the field.
                String currentValue = (String)this.ItemFieldValue;

                if (currentValue != null && currentValue != String.Empty)
                {
                    this.listBox.SelectedValue = currentValue;
                }
                else if (this.listBox.Items.Count > 0)
                {
                    this.listBox.SelectedIndex = 0;
                }

                // Add the script which updates the preview image.
                this.listBox.Attributes["onchange"] = "document.all.imgLogoPreview.src = '/logos/' + this.options[this.selectedIndex].value;";
                cell.Controls.Add(this.listBox);
                row.Cells.Add(cell);
            }

            cell = new HtmlTableCell();

            LiteralControl literalControl = new LiteralControl();

            String logo = null;
            object logoObject = this.ItemFieldValue;

            if (logoObject != null)
            {
                logo = (String)logoObject;
            }

            if (logo == null || logo == String.Empty)
            {
                logo = "MyDefaultLogo.png";
            }

            literalControl.Text = "<img id='imgLogoPreview' src='/logos/" + logo + "'></img>";

            cell.Controls.Add(literalControl);

            row.Cells.Add(cell);

            base.Controls.Add(table);
        }

        public override void UpdateFieldValueInItem()
        {
            this.EnsureChildControls();

            try
            {
                this.Value = this.listBox.SelectedValue;
                this.ItemFieldValue = this.Value;
            }
            catch (Exception)
            {
                ;
            }
        }

        protected override void Render(HtmlTextWriter output)
        {
            this.table.RenderControl(output);
        }
    }
}

ユーザー設定フィールド型およびユーザー設定フィールド コントロールを作成するには

  1. Microsoft Visual Studio で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

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

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

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

  5. [ソリューション エクスプローラ] で既定のプロジェクトの .cs または .vb ファイルをダブルクリックし、最初の例のようなコードを追加して、既定の Windows SharePoint Services フィールド型を拡張したユーザー設定フィールドのクラスを定義します。

  6. [ソリューション エクスプローラ] でプロジェクトを右クリックし、[追加] をポイントして、[新しいアイテム] をクリックします。

  7. [新しいアイテムの追加] ダイアログ ボックスで [コード ファイル] を選択し、[追加] をクリックします。

  8. [ソリューション エクスプローラ] で、前の手順で作成した新しい .cs または .vb ファイルをダブルクリックし、2 番目の例のようなコードを追加して、既定の Windows SharePoint Services フィールド コントロールを拡張したユーザー設定フィールドを表示するためのコントロールを定義します。

  9. ソリューションをビルドするには、Ctrl + Shift + B キーを押します。

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

次の例では、前述の例で定義したユーザー設定フィールド型を登録します。

<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">MyCompanyLogoField</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">My Company Logo</Field>
    <Field Name="TypeShortDescription">My Company Logo</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="Sortable">TRUE</Field>
    <Field Name="AllowBaseTypeRendering">TRUE</Field>
    <Field Name="Filterable">TRUE</Field>
    <Field Name="FieldTypeClass">MS.Samples.SharePoint.CustomFieldType.MyCompanyLogoField, MyExtendedFieldTypeControl1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34b96198b6e14eee</Field>
    <PropertySchema>
      <Fields></Fields>
    </PropertySchema>
    <RenderPattern Name="DisplayPattern">
      <HTML><![CDATA[<img style="zoom: 50%" src="/logos/]]></HTML>
      <Column HTMLEncode="TRUE" />
      <HTML><![CDATA[">]]></HTML>
    </RenderPattern>
  </FieldType>
</FieldTypes>

RenderPattern 要素 (フィールド型) 要素は、[すべてのアイテム] リスト ビューにフィールドを表示する方法を定義します。

このファイルの名前は fldtypes*.xml 形式 (例 : fldtypes_customfield.xml) で指定し、ローカル ドライブ:\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML に格納して、Windows SharePoint Services がカスタム ファイルのコンテンツを既定の FLDTYPES.XML ファイルと結合できるようにしておく必要があります。

ユーザー設定フィールド型のスキーマの詳細については、「ユーザー設定フィールド型の定義」を参照してください。

例を登録およびテストするには

  1. テキスト エディタで、前述の手順で作成したユーザー設定フィールド型およびカスタム コントロールを指定する CAML フィールド型定義ファイルを \TEMPLATE\XML に作成します。

  2. CAML ファイルを ローカル ドライブ:\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML に追加します。

  3. コマンド プロンプトで iisreset と入力して、インターネット インフォメーション サービス (IIS) をリセットします。

  4. サイト コレクションのルート Web サイトで "logos" という名前の画像ライブラリを作成し、会社のロゴに使用するイメージ ファイルを格納します。

  5. ユーザー設定フィールド型を追加するリストのビューで [設定] をクリックし、[列の作成] をクリックします。

  6. [列の作成] ページでフィールド型 (前述の例では My Company Logo という名前) をビューに追加します。

  7. リスト内の既存のアイテムを編集して会社のロゴを指定します。このロゴは、3 つのコントロール モードのすべておよびリスト ビューに表示されます。

See Also

タスク

[ウォークスルー] ユーザー設定フィールド型を作成する

概念

ユーザー設定フィールド型