[方法] リスト アイテムのフィールドの値を読み取る

最終更新日: 2010年4月16日

適用対象: SharePoint Foundation 2010

この記事の内容
概要
リストへの参照を取得する
リスト アイテムへの参照を取得する
フィールドの値を取得する

ここでは、特定のリスト アイテムの特定のフィールド (列) の値をプログラムによって読み取る方法について説明します。

概要

リスト アイテムの特定のフィールドの値を読み取るには、まず、リストが展開されている Web サイトへの参照をコードによって取得する必要があります。そして、リスト自体への参照、リスト アイテムへの参照を順に取得し、最後に特定のフィールドへの参照を取得します。ここでは、後半の 3 つの手順に焦点を当てながら、特に最後の手順について詳しく説明します。Web サイトへの参照の取得の詳細については、「サイト、Web アプリケーション、およびその他の主要オブジェクトへの参照を取得する」を参照してください。

リストへの参照を取得する

リストが含まれる Web サイトへの参照を取得したら、SPWeb オブジェクトの GetList(String) メソッドを呼び出すか、Web サイトの SPWeb.Lists プロパティのインデックスを使用して、リストへの参照を取得します。GetList(String) メソッドを使用するには、実行時にリストのサーバー相対 URL をコードによって渡すことができる必要があります。以下のコードは、設計時にリストのリテラル サーバー相対 URL がわかっている場合に、このメソッドを使用する例を示しています。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
         SPList list = web.GetList("/sites/Contoso/Lists/Books");
    }
}

サーバー相対 URL の詳細については、「URL 文字列の形式を記述する」を参照してください。

SPWeb.Lists プロパティで使用できるインデックスの種類は 3 つあります。

  • リストの GUID。SPList list = web.Lists[new Guid("53bd7850-49cc-4747-aded-e053659ace79")]; など。GUID は SPList.ID プロパティの値です。

  • Lists コレクションにおけるリストの位置を表す 0 から始まる序数。SPList list = web.Lists[12]; など。

  • リストの名前。SPList list = web.Lists["Books"]; など。名前は SPList.Title プロパティの値です。

よく使用されるのは最後に挙げたリストの名前です。リストの GUID またはリストの Web サイトのコレクションにおけるリストの位置が、設計時にわかっていることはめったにないからです。また、実行時にコードによって "認識される" こともほとんどありません。以下のコードは、コンテキスト内でのこの方法を示しています。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
         SPList list = web.Lists["Books"];
    }
}
ヒントヒント

Microsoft SharePoint Foundation では、"Get" メソッドを使用して特定の種類のオブジェクトを返すことができる場合は、コレクションのインデックスよりも、そのメソッドを使用します。通常、このルールに従うことでパフォーマンスが向上します。この場合は、実行時にリストのサーバー相対 URL をコードによって渡すことができるときに、SPWeb.Lists プロパティのインデックスに優先して GetList(String) メソッドを使用する必要があります。

リスト アイテムへの参照を取得する

リストへの参照を取得したら、複数の方法で、特定のリスト アイテムへの参照を取得できます。最適なパフォーマンスを確保するには、SPList オブジェクトの GetItemByIdSelectedFields(Int32, []) メソッドを使用することをお勧めします。最初のパラメーターはアイテムの ID 番号です。アイテムがリストに追加されるたびに、そのアイテムには 1 をベースとした整数 ID が指定されます。この ID は、直前のアイテムの ID に 1 を足した数値になります。アイテムがリストから削除されても、そのアイテムの ID 番号は再利用されません。2 番目のパラメーターは、コンテンツ データベースから返された、必要なアイテムのフィールドに指定された内部名の配列です。パフォーマンスを最大限に高めるには、コードによって後で参照されるリスト アイテムのフィールドのみを含めるようにします。以下に例を示します。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");
    }
}

ID 3 のリスト アイテムが取得されていますが、取得されているのは、そのアイテムの 3 つのフィールドのみであることに注意してください。また、フィールドの Title プロパティ (この場合は、"Retail Price") ではなく、販売価格フィールドの InternalName が使用されていることにも注意が必要です。

リスト アイテムのすべてのフィールドが必要な場合は、GetItemByIdAllFields(Int32) メソッドを使用します。このメソッドの唯一のパラメーターはアイテム ID です。特殊なリスト アイテムを取得することを目的とした特別なメソッドもいくつかあります。アイテムの ID プロパティの値ではなく、アイテムの GUID (UniqueId プロパティの値) がわかっている場合は、GetItemByUniqueId(Guid) メソッドを使用します。

リスト アイテムの ID や GUID のどちらも分かりませんが、そのアイテムの他のフィールドまたはプロパティの値がいくつかわかっている場合は、GetItems() メソッドのオーバーロードの 1 つを使用して複数のリスト アイテムを返し、ループ構造および条件構造を使用して必要なアイテムを選択できます。以下のコードは、この例を示しています。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItemCollection items = list.GetItems("Title", "ISBN", "Retail_x0020_Price");
        SPListItem item = null;
        foreach (SPListItem it in items)
        {
            if (it.Title == "Great Expectations")
            {
                 item = it;
            }
        }
}

また、LINQ to SharePoint プロバイダーを使用して、フィルターされた一連のアイテムを要求するクエリをリストに対して実行することもできます。LINQ クエリの select 句を使用して、必要なフィールドのみを指定します。LINQ を使用して SharePoint に対してクエリを実行する方法の詳細については、「[方法] LINQ to SharePoint を使用してクエリを実行する」を参照してください。

重要重要

SPList オブジェクトには Items プロパティが含まれています。そのメンバーにはインデックスを使用してアクセスできますが、これはお勧めしません。この方法により、すべてのリスト アイテムに対するすべてのメタデータがコンテンツ データベースから取得されるからです。

フィールドの値を取得する

必要なリスト アイテムへの参照を取得した後、フィールドの値をコードで読み取るには、SPListItem オブジェクトのインデックスを使用します。インデックスには GuidInt32、および String があります。フィールドの Id がわかっている場合は、Guid インデックスを使用できます。親リストのフィールドの 0 ベースの列番号がわかっている場合は、Int32 インデックスを使用できます。フィールドの InternalNameTitle、または StaticName がわかっている場合は、String インデックスを使用できます。ランタイムが最初に検索するのは内部名の文字列です。その後、フィールド タイトル、静的なフィールド名の順に文字列が検索されるので、内部名がわかっている場合は、その名前を使用すれば、コードのパフォーマンスが向上します。以下のコードは、この例を示しています。インデクサーによってフィールド値が常に Object 型として返されていることに注意してください。この例で示すように、通常は、より詳細な型にこれをキャストする必要があります。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");

        String bookISBN = (String)item["ISBN"];
    }
}

フィールドの値を、要素の値または要素の属性のどちらかとして HTML コードに挿入するように書式設定するには、SPListItem.GetFormattedValue(String) メソッドを使用します。このメソッドにより、値が文字列として返されますが、値にアンパサンド (&)、二重引用符 (")、一重引用符 (')、小なり記号 (<)、または大なり記号 (>) が含まれる場合、このような記号は適切な HTML エンティティに置き換えられます。

SPField クラス自体 (および、このクラスから派生する各クラス) には、特殊な方法でフィールド値を変換するメソッドがいくつか用意されています。上記で説明したように、各方法で SPListItem オブジェクトのインデックスを使用して、フィールド値への参照を最初に取得します。そして、その参照をパラメーターとして次のメソッドのいずれかに渡します (例: GetFieldValueAsText(item["ISBN"]).)。

  • GetFieldValueAsHtml(Object)   SPListItem.GetFormattedValue(String) と同様に動作します。上記を参照してください。

  • GetFieldValueAsText(Object)   フィールド値を String として返します。

  • GetFieldValueForEdit(Object)   派生クラスで上書きされるとき、編集リスト アイテム フォームおよび新規リスト アイテム フォームに適した書式でフィールド値を返します (例: ユーザーのカルチャ用に書式設定された日付/時刻値)。

  • GetValidatedString(Object)   派生クラスで上書きされるとき、検証チェックに渡されたフィールド値の文字列バージョンを返します。

  • GetFieldValue(String)   派生クラスで上書きされるとき、SPFieldUrlValue、ユーザー設定のデータ型など、複合データ型が基の値に含まれる場合に、フィールドの値を取得します。

これらのメソッドのいずれかを使用するには、フィールドへの参照を SPField オブジェクトとして取得する必要があります。それには、リスト アイテムの SPListItem.Fields プロパティを使用します。これは、親リストのフィールドのコレクションで、型は SPFieldCollection です。このオブジェクトには、指定した SPField オブジェクトを返す方法が複数用意されています。

  • GetField(String) メソッドを使用します。フィールドの内部名、タイトル、静的な名前を渡します。最初に検索されるのは内部名なので、内部名がわかっている場合は、その名前を使用すれば、パフォーマンスが向上します。静的な名前は最後に検索されます。

  • GetFieldByInternalName(String) メソッドを使用します。

  • TryGetFieldByStaticName(String) メソッドを使用します。

  • リスト アイテムの SPListItem.Fields プロパティの GuidInt32、または String インデックスを使用します。最初のインデックスは、渡された Guid オブジェクトと一致する Id プロパティが含まれる SPField オブジェクトを返します。2 番目のインデックスは、コレクション内における位置を示す 0 ベースの序数によって指定された場所の SPField オブジェクトを返します。3 番目のインデックスは、渡された文字列と一致する Title プロパティが含まれる SPField オブジェクトを返します (フィールドの内部名は文字列インデックスとして使用できません)。

以下のコードは、SPListItem および SPField 派生クラスのインデックスとメソッドを使用して、フィールドの値を取得する方法の例をいくつか示しています。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");

        // Get price as Double straight from the SPListItem object.
        Double dblPrice = (Double)item["Retail_x0020_Price"];        

        // Get the SPField object by using the GetFieldByInternalName method, and then get
        // price as string. 
        SPFieldCurrency priceField = (SPFieldCurrency)item.Fields.GetFieldByInternalName("Retail_x0020_Price");
        String strPrice = priceField.GetFieldValueAsText(item["Retail_x0020_Price"])

        // Get price as string from the SPField object. Use string SPFieldCollection index 
        // to get the SPField object (must use field object Title as index parameter). But 
        // use internal name of field as SPListItem index for better performance.
          String strPrice2 = item.Fields["Retail Price"].GetFieldValueAsText(item["Retail_x0020_Price"]);
    }
}

関連項目

概念

[方法] サイトおよびサイト コレクションを列挙する

[方法] リストからアイテムを返す