構成要素: 列とフィールド型

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

適用対象: SharePoint Foundation 2010

この記事の内容
列およびフィールド型のオブジェクト モデル
列およびフィールド型で使用される XML
列とフィールド型の開発に関連する領域
列とフィールド型の開発に関する詳細

ここでは、Microsoft SharePoint Foundation 開発の構成要素として列とフィールド型の概要を簡単に説明します。

ヒントヒント

SharePoint Foundation 開発では、"フィールド" という用語が関連性の深い 2 つの意味を持ちます。リスト内の列を指すこともありますが、1 つのリスト アイテムを問題にしている場合は "セル" (表のある行とある列が重なる部分) と同様の意味を持ちます。こうした理由もあって、"列" という用語と "フィールド" という用語は、SharePoint Foundation 開発の文脈ではほとんど同義語になっています。たとえば、列を表すオブジェクトは、SPField クラスまたはその派生クラスのオブジェクトです。

SharePoint Foundation における列は、特定のデータ型のデータを含むだけでなく、それ自身が一種の型になっています。というのは、データが異なる複数のリストで同じ列を使用できるからです。列は、サイト内の列ギャラリで存続できます。ギャラリにあるサイト内の列は、プログラムによって、またはユーザー インターフェイス (UI) の利用によって、そのサイトの任意のリストに追加できます。また、列の追加は、それがプログラムによるものであれ、UI の利用によるものであれ (コンテンツ タイプ デザイナーなど)、コンテンツ タイプに対して行うこともできます。

SharePoint Foundation に組み込まれているサイト内の列の一部として、"住所"、"誕生日"、"秘書"、および "URL" があります。それぞれの列は、ある少数の "型の種類" ("型種類" とも呼ばれますが、多くの場合は "フィールド型" と呼ばれます) または別のそうした型の種類に属しています。たとえば、住所、誕生日、秘書、および URL のフィールド型は、それぞれ、複数行テキスト、日付と時刻、1 行テキスト、および URL です。フィールド型の完全なリストは、SPFieldType 列挙の値によって指定されます。以下に、特に重要な値を示します。

  • ブール値 – true または false のみの値をとるフィールドです。

  • 集計値 – 実行時に数式から値が計算されるフィールドです。

  • 選択肢 – 有限のリストに列挙された値のいずれか 1 つだけを持つことができるフィールドです。リストの値を複数持つことができる複数選択に対応したフィールド型もあります。

  • 計算値 – 同じリスト アイテムの別のフィールドに依存する値を持つフィールドです。通常は、1 つ以上のフィールドに対して実行される論理演算値です。

  • 参照 – 選択肢フィールドに類似したフィールドですが、使用できる値のリストがほかのリストの列に記されている点が異なります。

  • テキスト – 単一行のテキストを値にとるフィールドです。複数行のテキストに対応したフィールド型もあります。

以下に、フィールドで実行できる主要な操作 (プログラムと XML マークアップのどちらかによるもの) をいくつか示します。

  • リスト アイテム内にある特定のフィールドの値の読み取りおよび書き込みを行う。

  • リストに対して列の追加および削除を行う。

  • サイト内の列ギャラリに対して列の追加および削除を行う。

  • リスト アイテム作成、リスト アイテム編集、リスト アイテム表示の各フォームでフィールドの表示方法を変更する。

  • リスト ビューで列の表示方法を変更する。

  • ユーザー設定フィールド型を作成する。

  • 1 つ以上のカスタム レンダリング コントロールを作成して、さまざまな種類のページおよびフォームのフィールドをレンダリングする。

  • 1 つ以上のモバイル レンダリング コントロールを作成して、フィールドをモバイル デバイス上にレンダリングする。

  • クエリ結果から不要な列を除外する。

  • ある表が別の表を参照するルックアップ列を持つ場合に、2 つの表の結合を実行する。

列およびフィールド型のオブジェクト モデル

注意

このトピックでは、SharePoint Foundation のサーバー オブジェクト モデルにあるクラスのみを明示的に参照します。クライアント オブジェクト モデルは、これらのサーバー クラスのほとんどについて同等のクラスを持ちます。一般的に (ただし普遍的ではありません)、サーバー クラス名が "SP" で始まる場合は、その "SP" というプレフィックスを取り除いた名前が、同等のオブジェクト クラスの名前になります。

SPListItem インデクサー

SharePoint Foundation 開発における最も一般的なコーディング作業の 1 つとして、リスト アイテム内のフィールドの読み書きがあります。こうした操作を行うには、リスト アイテムを表す SPListItem オブジェクトへの参照を取得し、そのインデクサーの 1 つ (Item) を使用してフィールドを指定します。インデクサーには、Int32 オブジェクトを受け入れるものと String オブジェクトを受け入れるもの以外に、Guid オブジェクトを取るものがあります。最後のものは、Id プロパティによってフィールドを取得するのに使用できます。String インデクサーでは、フィールドの内部名と表示名のどちらかを渡すことができます。

SPField とその派生クラス

それぞれのフィールド型は、SPField から派生したクラスによって表されます。たとえば、SPFieldBoolean はブール値フィールドを表し、SPFieldChoice は選択肢フィールドを表します。Web サイトのサイト内の列ギャラリで指定されている列はすべて、これらのクラスのいずれかのオブジェクトです。指定フィールド型の各列の間の違いは、そのクラスのプロパティによって生じます。たとえば、"誕生日" 列と "期限" 列はどちらも SPFieldDateTime クラスのオブジェクトですが、両者の間では特に Title プロパティの値が異なっています。SPField クラスのメンバーの中には、その列がどのリストに含まれているかを返す ListsFieldUsedIn() プロパティがあります。また、このクラスには、列内に同じ値を持つセルがないことを保証する EnforceUniqueValues メソッドのほか、Filterable プロパティや Sortable プロパティもあります。

SPField クラスの重要なメンバーの 1 つが Update() メソッドです。列に対する変更を保存するには、このメソッドを呼ぶ必要があります。

ヒントヒント

SPField の派生クラスのそれぞれは、そのオブジェクトがリスト アイテム内の特定のフィールド (つまり、リスト ビューにおいてその列内の特定のセルに対応するエンティティ) を表すことを示唆するいくつかのメンバーを持ちます。たとえば、GetFieldValue(String) メソッドや HasValue(Object) メソッドがそうです。また、あるリスト アイテムがフォーム (作成フォーム、編集フォームなど) に表示される際にそのフィールドがどのように表示されるかを決定する FieldRenderingControl プロパティもあります。SPField の派生オブジェクトを以上のように捉えてこれらのメンバーを処理すると便利なことがありますが、こうした派生オブジェクトには特定のリスト アイテム内のフィールドの値を保持するプロパティがなく、SPField.Update() メソッドの呼び出しではそのような値に対する変更が保存されないことに注意してください (FieldRenderingControl プロパティ内のオブジェクトにはそのようなメンバー、具体的には ItemFieldValue プロパティがありません)。同様に、GetFieldValue(String) は、実際には値を取得せず、パラメーターとして渡された値を変換します。また、HasValue(Object) は、渡されたオブジェクトが null であるかどうかのみを返します。もちろん、その目的は、両メソッドに渡された値が特定のリスト アイテム内のフィールドの値になるようにすることです。しかし、こうした形で両メソッドを使用することは、プログラマの責任です。リスト アイテム内の特定のフィールドのデータを読み書きする基本的な方法は、SPListItem オブジェクトでインデクサーを使用することです。

SPField またはそれを継承するクラスから新しいクラスを派生させることで、ユーザー設定フィールド型を作成できます。詳細については、「[方法] ユーザー設定フィールド クラスを作成する」を参照してください。

注意

SPField を継承するすべてのクラスがユーザー設定フィールド型クラスの基本クラスとして使用できるわけではありません。マイクロソフトが派生をサポートしているクラスの一覧については、[方法] ユーザー設定フィールド クラスを作成する を参照してください。

BaseFieldControl とその派生クラス

アイテム作成フォームやアイテム編集フォーム (ときには表示フォーム) への特定のリスト アイテム内のフィールドの表示は、通常、BaseFieldControl から派生したクラスのオブジェクトによって管理されます。たとえば、SPFieldBoolean オブジェクトは BooleanField クラスのオブジェクトによって表示され、SPFieldUrl オブジェクトはUrlField クラスのオブジェクトによって表示されます。

レンダリング コントロールをインスタンス化するオブジェクトは、その Field プロパティ内に、自らがレンダリングするフィールド オブジェクトへの参照を保持します。後者は、その FieldRenderingControl プロパティ内に、そのレンダリング コントロールへの参照を保持します。これらの相互参照が示唆するように、2 つのオブジェクトはパートナーです。SPField の派生オブジェクトは列の構成を処理し、BaseFieldControl の派生レンダリング コントロールはユーザーとのやりとりや、UI でのリスト アイテムのフィールドのレンダリングを処理します。

レンダリング コントロール オブジェクトは、Value プロパティ、ItemFieldValue プロパティ、UpdateFieldValueInItem() メソッド、および OnLoad(EventArgs) ハンドラーによって、データベース内のフィールドとの同期が維持されます。アイテム編集フォームでは、ItemFieldValue プロパティがそのフォームにレンダリングされている特定のリスト アイテム内のフィールドの値をコンテンツ データベース内に持ちます。アイテム作成フォームでは、ItemFieldValue が既定値を持ちます。OnLoad(EventArgs) ハンドラーは、Value プロパティに ItemFieldValue プロパティの値を割り当てます。ユーザーがフォーム上で値を設定または変更する場合は、UpdateFieldValueInItem() メソッドが ItemFieldValue プロパティに Value プロパティの値を割り当てます。

BaseFieldControl クラスまたはこれを継承するクラスから新しいクラスを派生させることによって、ユーザー設定フィールドのレンダリング コントロールを作成できます。詳細については、「[方法] フィールド レンダリング コントロールを作成する」を参照してください。

レンダリング テンプレート

フィールドのレンダリング コントロールを作成する作業 (子コントロールの作成など) のほとんどは、レンダリング テンプレートによって行われます。すべてのレンダリング コントロールには、少なくとも 1 つのレンダリング テンプレートが関連付けられています。RenderingTemplate オブジェクトは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES フォルダー内にある ascx ファイルの RenderingTemplate 要素として定義されます。このレンダリング テンプレートは、レンダリング コントロール オブジェクトの TemplateName プロパティ内でその ID 値によって参照されます。レンダリング作業のほとんどはこのレンダリング テンプレートが行うので、CreateChildControls() メソッドは従来の Microsoft ASP.NET コントロール クラス内での作業を行うだけで済みます。通常、このメソッドは子コントロールに対する最終調整のみを行います。たとえば、フィールドがアイテム作成フォームにレンダリングされている場合は子コントロールに既定値を割り当てたり、アイテム編集フォームでは子コントロールに現在の値を割り当てたりします。

ユーザー設定レンダリング テンプレートを作成して、ユーザー設定レンダリング コントロールで使用することができます。詳細については、「[方法] フィールド レンダリング テンプレートを作成する」を参照してください。

SPMobileBaseFieldControl とその派生クラス

モバイル デバイス版の SharePoint Foundation ページでのフィールド レンダリングは、SPMobileBaseFieldControl の派生クラスによって管理されます。たとえば、SPFieldBoolean オブジェクトは、SPMobileBooleanField クラスのオブジェクトによってレンダリングされます。これらのクラスの 1 つから派生した独自のモバイル版のフィールド レンダリング コントロールを作成することができます。

大まかに言えば、これらのクラスが携帯フォームに提供する機能は、BaseFieldControl の派生クラスが非携帯フォームに提供する機能とほとんど同じです。ただし、アーキテクチャには以下の違いがあります。

  • SPMobileBaseFieldControl 派生クラスの継承ツリーは、Control クラスではなく、ASP.NET の Control クラスを踏襲しています。また、このツリーの SharePoint Foundation 部分の内部では、非モバイル版のレンダリング コントロール内にある TemplateBasedControl および FormComponent クラスから継承された機能が、モバイル版のレンダリング コントロールの SPMobileComponentクラスに統合されています。

  • モバイル版のレンダリング コントロールには独自のレンダリング テンプレート群があるので、ユーザー設定レンダリング テンプレートを非モバイル ページ用に作成する場合は、モバイル ページ用とは別のものの作成が必要になることがあります。

  • モバイル コンテキスト向けに作成したユーザー設定フィールド レンダリング コントロールは、非モバイル コンテキスト向けに作成したユーザー設定フィールド レンダリング コントロールよりも、フィールドのレンダリング時にコントロールの CreateChildControls() メソッドに依存する度合いが高くなり、これに伴ってレンダリング テンプレートへの依存度が低くなります。また、モバイル版のユーザー設定レンダリング コントロールの作成時には、多くの場合、CreateChildControls() メソッド自身のオーバーライドを行いません。通常、代わりにオーバーライドされるのは、CreateChildControls() によって呼び出されるほかの 4 つのメソッド (CreateControlForDisplay()CreateControlForEdit()CreateControlForNew()、および CreateControlForView()) のうちの 1 つ以上です。

  • モバイル版のレンダリング コントロールをインスタンス化するオブジェクトは、その Field プロパティ内に、レンダリングするフィールド オブジェクトへの参照を保持します。後者は、そのモバイル版のレンダリング コントロールへの参照を、自らの FieldRenderingMobileControl プロパティ内に保持します。コンテンツ データベースとレンダリング コントロールとの同期に関与するメンバーは、SPMobileBaseFieldControl の派生クラスの場合と、それらのクラスが BaseFieldControl の派生クラス内にある前述の場合では若干異なります。

    モバイル ページでのフィールド レンダリングの詳細については、「[方法] モバイル ページでフィールド レンダリングをカスタマイズする」を参照してください。

ユーザー設定フィールド値クラス

複雑な種類のデータを保持するユーザー設定フィールド型を作成する場合は、ユーザー設定フィールド値クラスの作成が必要になることがあります。一部の組み込みフィールド型は、特殊で複雑な値の型を必要とします。たとえば、SPFieldLookup フィールド型のオブジェクトは、SPFieldLookupValue クラスによって表される特殊な型の値をとります。ユーザー設定フィールド値クラスを作成する方法の詳細については、「[方法] ユーザー設定フィールド値クラスを作成する」を参照してください。

ViewFieldsOnly と結合

SPQuery オブジェクトを使用して Collaborative Application Markup Language (CAML) クエリを表す際には、ViewFields プロパティや ViewFieldsOnly プロパティを使用して、クエリがコンテンツ データベースから不要なフィールドのフェッチを行わずに済むようにすることができます。LINQ to SharePoint プロバイダーを使用してリスト データのクエリを実行する場合は、LINQ の select キーワードを同じ目的で使用できます。また、クエリによって 2 つ以上のリストを結合できる Joins プロパティもあります。さらに、LINQ to SharePoint プロバイダーは、join キーワードをサポートしています。詳細については、「結合と予測のリストを作成する」を参照してください。

列およびフィールド型で使用される XML

列とフィールド型の定義には、かなりの量の XML マークアップが関与します。

フィールド型定義

フィールド型の詳細な定義は、メインのリスト スキーマの一部である Field 要素によって提供されます。詳細については、「Field 要素 (リスト)」を参照してください。フィールドが機能の一部として展開されている場合は、この要素が機能のマニフェスト ファイルで使用されます。詳細については、「フィールド定義」を参照してください。

フィールド型 XML と XSLT スタイルシート

レンダリングするには、フィールドを、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\XML にあるパターン fldtypes*.xml で指定されたファイル内で、SharePoint Foundation に登録する必要もあります。このファイルの形式は、Field Type XML です。こうした登録のマークアップはシンプルなフィールド型定義で、あるフィールド型の基本的な特性を記録し、そのフィールド型のアセンブリおよびマネージ クラスを識別します (フィールド型定義に対する読み取り専用アクセスは、オブジェクト モデル内で SPFieldTypeDefinition クラスを介して利用できます)。

リスト ビューでは、フィールド値が XSLT スタイルシートによってレンダリングされます。また、各列の上部にあるヘッダーも XSLT スタイルシートによってレンダリングされます。ユーザー設定フィールドの XSLT スタイルシートを作成するか、既存のフィールドの標準レンダリングをオーバーライドできます。すべてのスタイルシートが %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL に保持されます。

ASP.NET ユーザー コントロール

ASP.NET ユーザー コントロールは、ascx ファイル内で定義され、フィールド型の開発において 2 つの目的で使用できます。1 つ目は、レンダリング コントロールと呼ばれるユーザー コントロール (上記の「BaseFieldControl とその派生クラス」を参照) とレンダリング テンプレートで行われる表示、新規作成、および編集フォームでのフィールド レンダリングです。レンダリング テンプレートは、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates フォルダー内にある ascx ファイル内の <RenderingTemplate> 要素で定義され、オブジェクト モデル内で RenderingTemplate クラスによって表されます。このクラスは、テンプレート化されたユーザー コントロールの ASP.NET システムの上に使いやすい抽象レイヤーを提供します。レンダリング テンプレート、およびそれらとレンダリング コントロールとの関係の詳細については、「レンダリング テンプレート」を参照してください。2 つ目の目的は、フィールド型自体の可変プロパティの値が、そのフィールドを含むさまざまなリストのさまざまな値である場合です。この場合は、プロパティ編集コントロールをユーザー コントロールとして ascx ファイル内に作成します。この作業の詳細については、「ユーザー設定フィールド型のプロパティのレンダリング」を参照してください。

クエリ スキーマにおける結合の種類

Collaborative Application Markup Language (CAML) クエリ スキーマ には、Join 要素 (ビュー) が含まれています。これを使用すると、あるリストに別のリスト内の列を参照するルックアップ列がある場合に、2 つのリストを結合して 1 つの CAML クエリ内に入れることができます。この要素によって、LINQ to SharePoint プロバイダーを使用する LINQ クエリ内で暗黙的な結合と明示的な結合を使用できるようにもなります。

列とフィールド型の開発に関連する領域

構成要素: リストとドキュメント ライブラリ

構成要素: コンテンツ タイプ

列とフィールド型の開発に関する詳細

開発プロジェクトでの列とフィールド型の使用に関する広範かつ詳細な情報は、「リスト フォーム」、「」、および「ユーザー設定フィールド型」に関するノードのセクション「SharePoint Foundation 開発の詳細」に記されています。フィールド レンダリングを行うモバイル デバイス レンダリングの開発の詳細については、「[方法] モバイル ページでフィールド レンダリングをカスタマイズする」を参照してください。

リスト アイテム内の特定のフィールドの値の読み取りは、SharePoint での必須のプログラミング タスクの 1 つです。詳細については、「[方法] リスト アイテムのフィールドの値を読み取る」を参照してください。

SharePoint Foundation でのデータのクエリ実行の詳細については、「クエリとデータ取得」を参照してください。