またSharePointに苦戦した件。

まだSharePointについて分かっていないなあ・・・」でもSharePointについて苦戦してることを書いたけど、今日(昨日)も苦戦した・・・しかも前の日記から遠くない部分で。

「リスト」や「ドキュメントライブラリ」に対応するクラス「SPList クラス」のメンバにリストアイテムのコレクションを保持するメンバ「SPList.Items プロパティ」があるけれどこれはすべてのアイテムを保持していない。
前回の日記に書いたとおり「フォルダ」は「SPList.Folders プロパティ」に含まれる。しかしそれだけではなかった!
SPList.ItemCount プロパティ」というメンバに関して、ドキュメントライブラリ(バージョン管理、コンテンツ承認有効)において、なんと
SPList.ItemCount > SPList.Items.Count + SPList.Folders.Count
となる場合があったのだ!この差分の正体は・・・
システムアカウント以外のアカウントでドキュメントをアップロードして、プロパティ設定をキャンセルしたアイテム。
その投稿者のビューには表示されるが、システムアカウントのビューにさえもは表示されないし、上記Itemsの中にも入ってこない!理由はチェックアウト前は存在しないアイテムだからだろう。
それらはWeb画面ではドキュメントライブラリの設定の「チェックアウト済みファイルの管理」で参照できる。問題はプログラミングAPIである。
SPDocumentLibrary クラス」(SPListで参照してたならasでダウンキャスト)にそれらしいメンバが!
SPDocumentLibrary.CheckedOutFiles プロパティ」である。この型はIListで要素の型は「SPCheckedOutFile
SPCheckedOutFileのメンバ

名前 説明
プロパティ CheckedOutBy ファイルをチェックアウトするために使用されるアカウントのユーザー名を返します。 
プロパティ CheckedOutByEmail ファイルのチェックアウトに使用されたアカウントの電子メール アドレスを返します。 
プロパティ CheckedOutById ファイルのチェックアウトに使用されたアカウントのユーザー ID を返します。 
プロパティ CheckedOutByName ファイルのチェックアウトに使用されたアカウントの名前を返します。 
プロパティ DirName ファイルをチェックアウトするために使用されるアカウントのユーザー名を返します。 
プロパティ ImageUrl チェックアウトされたファイルのサイトの URL を返します。 
プロパティ LeafName チェックアウトされたファイルのリーフ名を返します。 
プロパティ Length チェックアウトされたファイルのファイル長を返します。 
プロパティ ListItemId チェックアウトされたファイルのリスト アイテムの値を返します。 
プロパティ TimeLastModified チェックアウトされたファイルの最終変更時刻を返します。 
プロパティ Url チェックアウトされたファイルの Uniform Resource Locator (URL) 文字列を返します。 
メソッド Delete チェックアウトされたファイルをサイトから削除します。 
メソッド TakeOverCheckOut 現在チェックアウトされているファイルを別のユーザー アカウントが制御していることをサイトに通知します。(正直意味不明・・・)

の通り。しかーしここで喜ぶのはまだ早ーい!「SPCheckedOutFile」は「SPListItem」と継承関係でもhas-a関係でもない。アイテムを操作するには「SPListItem」としての参照が欲しい。
「ListItemId」があるからと言って、そのまま該当アイテムを「SPList.GetItemById メソッド」を使って取得しようとすると例外となってしまう。

  1. まず「TakeOverCheckOutメソッド」を実行する。(ただし、これを実行すると元のユーザの権限を奪ってしまうので、元のユーザはアイテムにアクセスできなくなる。)
  2. SPList.GetItemById メソッド」などを使って対応するSPListItemのオブジェクトを取得する。

これで、やっとSPListItemを参照することができる。

MSDNライブラリの「SPList.Itemsプロパティ」の備考に

Items プロパティはドキュメント ライブラリ内のすべてのファイル (サブフォルダ内のファイルも含む) を返しますが、フォルダそのものは返しません。ドキュメント ライブラリでは、フォルダはアイテムとは見なされません。

と書かれているが、正確ではないと思う。