リストのオブジェクトとコレクションを操作する
最終更新日: 2010年4月9日
適用対象: SharePoint Foundation 2010
この記事の内容
オブジェクト
コレクション
インデクサ
SharePoint Web サイト内のリスト データに対してアクションを実行するには、まず、オブジェクト モデルへのエントリ ポイントとして機能する SPWeb オブジェクトを取得する必要があります。このオブジェクトによって、リスト、アイテム、ドキュメント、ユーザー、通知などにアクセスすることができます。SharePoint Web サイトを取得する方法については、「サイト、Web アプリケーション、およびその他の主要オブジェクトへの参照を取得する」を参照してください。
オブジェクト
Microsoft.SharePoint 名前空間および Microsoft.SharePoint.Administration 名前空間に含まれるクラスのほとんどは、SP で始まります。一般に、Microsoft.SharePoint アセンブリに属するクラスのうち、このプレフィックスが付かないクラスは Web フォーム コントロールを表します。
SharePoint Foundation では、オブジェクト プロパティに変更を加えた場合、そのオブジェクトに対して Update メソッドを呼び出すまで変更はデータベースに保存されません。タスク リストのタイトルと説明を変更するコードの例を次に示します。
Dim oList As SPList = oWebsite.Lists("Tasks")
oList.Title = "New_Title"
oList.Description = "List_Description"
oList.Update()
SPList oList = oWebsite.Lists["Tasks"];
oList.Title="New_Title";
oList.Description="List_Description";
oList.Update();
注意
ドキュメントがドキュメント ライブラリからチェックアウトされている場合は、SPListItem オブジェクトの Update() メソッドを使用してドキュメントのメタデータを変更できません。
コレクション
リストが SharePoint サイトの中心的な存在であるのと同じように、コレクションはオブジェクト モデルの中心に位置します。コレクションを使用することによって、オブジェクト タイプの追加、削除、列挙、更新を行うことができます。ほとんどのコレクション クラスに共通する特徴として、以下の点が挙げられます。
名前が "Collection" で終わります。
System.Collections.ICollection インターフェイスを実装します。
Int32 型の Count プロパティがあります。
コレクション内の nth 番目のアイテムを取得するのに使用できる Int32 インデクサーがあります。
アイテム識別子を受け取るインデクサーがあります。
Add メソッドと Delete メソッドがあります。
通常、コレクションの Add メソッドを呼び出すと、データを更新するために追加情報が必要な場合を除き、バックエンド サーバー上のデータベースが適切なデータによって更新されます。この場合、Add メソッドが返すオブジェクトを使用して、情報を収集できます。たとえば、リストにアイテムを追加するには、まず Microsoft.SharePoint.SPListItemCollection クラスの Add メソッドを使用して SPListItem オブジェクトを取得し、そのオブジェクトの適切なプロパティに値を割り当てます。次に Update メソッドを呼び出し、変更をコンテンツ データベースに適用します。
インデクサ
インデクサーは、コレクションの個々のアイテムに対するアクセス手段として利用できます。アイテムを取得するには、コレクション内のアイテムを示すインデックスまたは文字列を、Microsoft C# の場合は角かっこ ([])、Microsoft Visual Basic の場合はかっこ (()) で囲んで指定します。
たとえば、oWebsite が SPWeb クラスのインスタンスを表す場合、お知らせリストは、C# では SPList oList = oWebsite.Lists["Announcements"] が返し、Visual Basic では Dim oList As SPList = oWebsite.Lists("Announcements") が返します。
リストからアイテムを返すには、リスト オブジェクトの GetItem* メソッドの 1 つを呼び出して、どのアイテムを取得するかを指定することをお勧めします。Items プロパティを使用してリスト内のすべてのアイテムを取得すると、すべてのアイテムのすべての列が強制的に返されるので、パフォーマンスが低下する可能性があります。代わりに、たとえば、GetItems メソッドを使用して SPQuery オブジェクトを渡してサブセット SPListItemCollection collItem = oList.GetItems(oQuery) (Visual Basic では Dim collItem As SPListItemCollection = oList.GetItems(oQuery)) を指定します。
GetItem* メソッドを使用してリストからアイテム コレクションを返した後に、フィールド名をインデクサーとして指定し、コレクションを反復処理してフィールドから値を返すことができます。次の例は、コレクションの各アイテムの期限日、状態、およびタイトルの値を表示します。
Dim oItem As SPListItem
For Each oItem In collItem
Response.Write(SPEncode.HtmlEncode(oItem("Due Date").ToString()) + "<BR>")
Response.Write(SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")
Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + "<BR>")
Next oItem
foreach(SPListItem oItem in collItem)
{
Response.Write(SPEncode.HtmlEncode(oItem["Due Date"].ToString()) + "<BR>");
Response.Write(SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + "<BR>");
}
注意
Microsoft.SharePoint 名前空間には using ディレクティブ (Visual Basic では Imports) が必要ですが、それに加え上記の例では Microsoft.SharePoint.Utilities 名前空間にもディレクティブが必要です。
次の例に、SharePoint Web サイト上のタスク リストから Title フィールドおよび Status フィールドの値をすべて取得するコードの例を示します。
Dim oWebsite As SPWeb = SPContext.Current.Web
Dim oList As SPList = oWebsite.Lists("Tasks")
Dim collItem As SPListItemCollection = oList.GetItems("Title", "Status")
Dim oItem As SPListItem
For Each oItem In collItem
Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + " :: " _
& SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")
Next oItem
SPWeb oWebsite = SPContext.Current.Web;
SPList oList = oWebsite.Lists["Tasks"];
SPListItemCollection collItem = oList.GetItems("Title", "Status");
foreach(SPListItem oItem in collItem)
{
Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + " :: " +
SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
}
要求調整が実装されている場合、参照数またはアイテム数が多すぎるという問題が原因となり、非効率的なクエリがブロックされる可能性があります。クエリの効率性を高め、参照数の問題を減らすには、次の例で示すように、制限された一連のビュー フィールド (ViewFields) を指定する SPQuery オブジェクトを定義し、このクエリ オブジェクトを GetItems メソッドに渡します。
Dim oQuery As New SPQuery()
oQuery.Query = "<ViewFields><FieldRef Name = ""Title"" />" &
"<FieldRef Name = ""Status""/></ViewFields>"
Dim collItem As SPListItemCollection = oList.GetItems(oQuery)
SPQuery oQuery = new SPQuery();
oQuery.Query = "<ViewFields><FieldRef Name = \"Title\" />" +
"<FieldRef Name = \"Status\"/></ViewFields>";
SPListItemCollection collItem = oList.GetItems(oQuery);
アイテム数の調整に関する問題に対応するには、SPListItemCollectionPosition クラスを使用して、アイテム インデックスの結果をページングしなければならない可能性があります。
注意
Microsoft.SharePoint 名前空間には using ディレクティブ (Visual Basic では Imports) が必要ですが、それに加え上記の例ではMicrosoft.SharePoint.Utilities 名前空間にもディレクティブが必要です。
インデクサーを使用してリスト内の値を変更することもできます。次の例では、新しいリスト アイテムをコレクションに追加し、そのアイテムに URL 列の値を割り当てています。
Dim oNewItem As SPListItem = oList.Items.Add()
oNewItem("URL_Field_Name") = "URL, _ Field_Description"
oNewItem.Update()
SPListItem oNewItem = oList.Items.Add();
oNewItem["URL_Field_Name"] = "URL, Field_Description";
oNewItem.Update();
注意
URL フィールド型は、カンマとスペースで区切られた 2 つの値から構成される独特なものです。上記の例では、その両方の値が、1 つのインデクサによって新しいアイテムに割り当てられます。
次の例では、GetItemById(Int32) メソッドを使用してアイテムを返し、Status 列と Title 列の値を設定しています。
Dim oItem As SPListItem = oList.GetItemById(1)
oItem("Status") = "Task_Status"
oItem("Title") = "Task_Title"
oItem.Update()
SPListItem oItem = oList.GetItemById(1);
oItem["Status"]="Task_Status";
oItem["Title"]="Task_Title";
oItem.Update();
フィールドのリストを指定してアイテムを取得できる場合、また、どのフィールドも Lookup 型または SPFieldLookup から継承するフィールド型ではない場合は、GetItemById(Int32) を呼び出す代わりに、GetItemByIdSelectedFields(Int32, []) を呼び出してパフォーマンスを向上させることができます。
注意
インデクサに指定したアイテムが見つからない場合は、例外 ArgumentOutOfRange が返されます。
SharePoint Foundation のリスト アイテムに使用される特定のデータ形式については、SPListItem クラスを参照してください。
関連項目
参照
Microsoft.SharePoint.Administration
概念
SharePoint Foundation オブジェクト モデルにおける名前空間
Visual Studio を使用して SharePoint 開発を行う