また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のメンバ
名前 | 説明 | |
---|---|---|
プロパティ | 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 メソッド」を使って取得しようとすると例外となってしまう。
- まず「TakeOverCheckOutメソッド」を実行する。(ただし、これを実行すると元のユーザの権限を奪ってしまうので、元のユーザはアイテムにアクセスできなくなる。)
- 「SPList.GetItemById メソッド」などを使って対応するSPListItemのオブジェクトを取得する。
これで、やっとSPListItemを参照することができる。
MSDNライブラリの「SPList.Itemsプロパティ」の備考に
Items プロパティはドキュメント ライブラリ内のすべてのファイル (サブフォルダ内のファイルも含む) を返しますが、フォルダそのものは返しません。ドキュメント ライブラリでは、フォルダはアイテムとは見なされません。
と書かれているが、正確ではないと思う。