2

Microsoft.Sharepoint.Client 名前空間のクラスを使用して SharePoint サイトを操作しています。Windows Phone 7 で作業しているため、SPFolderCollection/SPFolder クラスが見つかりません。

非表示のフォルダーとシステム フォルダー (eg_vti_pvt) を除外する必要があります。

次のような例を見つけました。

// filter the folders like “_catalogs” or “_private”
                if (folder.ParentListId != Guid.Empty)
                {
                    SPList list  = web.Lists[folder.ParentListId];
//filter the folders like “Reporting Templates” or “IWConvertdForms”
                    if (list.Hidden == false)

( http://go4answers.webhost4life.com/Example/know-spfolder-invisible-visible-27871.aspxから取られた例)。

ただし、「SP」クラスがないため、Windows Phone に実装できません (ParentListId メソッドはありません)。

どんなアイデア/回避策も大歓迎です。

ありがとうございました。

PS注意してください、CAMLの使用は絶対に避けたいと思います。ファイルとフォルダーの URL を一覧表示して取得できれば十分です。リストや通知を操作する必要はありません。

更新 したがって、次のように制限を回避できるようです:

Foldercollection folder_assist = new FolderCollection( WHAT DO I PUT HERE??? );
    ctx.Load(folders);
                ctx.ExecuteQueryAsync(delegate(object sender1, ClientRequestSucceededEventArgs args)
                {
                foreach (Folder f in folders)
                {
                    ctx.Load(f.ParentFolder);
                }
                ctx.ExecuteQuery();
                foreach (Folder f in folders)
                {
                    List ejh;
                     // if we are in the top folder, the .parentfolder may be null
                    if (f.ParentFolder != null && f.ParentFolder.Name != "")
                    {
                        ejh = ctx.Web.Lists.GetByTitle(f.ParentFolder.Name);
                    }
                    else
                    {
                        ejh = ctx.Web.Lists.GetByTitle(f.Name);
                    }
                    ctx.Load(ejh);

                    try
                    {
                        ctx.ExecuteQuery();
                    }
                    catch
                    {
                        ejh = null;
                    }
                    if (ejh != null)
                    {
                        if (ejh.Id != Guid.Empty)
                        {
                            if (ejh.Hidden == false)
                            {
                     folder_assist.Add(f.ServerRelativeURL;
                         }
                        }
                    }
                } 
                win.Dispatcher.BeginInvoke((Action)(() => DO SOME WORK...

            }, delegate(object sender1, ClientRequestFailedEventArgs args)
                {
                   win.Dispatcher.BeginInvoke((Action)(() => MessageBox.Show("something went wrong" + args.ToString())));
                });

私が今経験している問題は最初の行にあります - Microsoft.Sharepoint.FolderCollection コンストラクターにはコンテキスト (私が持っていて簡単に渡すことができます) と ObjectPath タイプが必要なようです。非表示でも特別でもないすべてのフォルダ。

これを回避するにはどうすればよいですか?

更新 2

わかりました、かなり明白な結果です。私はファシストに使用List<Folder>しました。

しかし、私が気づいたことがさらに2つあります。

a)私のソリューションのパフォーマンスはかなりひどいです。以前はリストを取得するのに少し時間がかかっていましたが (非同期スレッドでフィルタリングしていなかったとき)、リストを取得するのに 10 ~ 20 秒かかりました (そして、サーバーにはほんの一握りのアイテムしかありません!)。

アイデア/提案はありますか?(本当の問題は、フォルダー コレクションを UI スレッドに戻して解析し、1 つずつ追加することができないことです。これは、parentFolder に対してクエリを実行する必要があるためです。また、foreach() ループ内で非同期でそれを実行しようとすると、 UI スレッドはクエリの実行を待機しないため、インスタンス化されていないオブジェクトを取得します。AutoResetEvent を使用して待機させると、UI スレッドがロックされます。また、WP7 では ClientContext.Executequery( を使用することはできません。 )UIスレッドで。残念です。)

b) アクセスするすべてのフォルダー内に「フォーム」フォルダーがまだあるようです。現在取り組んでいますが、どんなアイデアでも大歓迎です。

4

2 に答える 2

0

クラスの前に SP がない理由は、使用した例がサーバー オブジェクト モデルです。これは、SharePoint がインストールされたサーバーでのみ実行されます。

使用している Windows Phone のバージョンはクライアント オブジェクト モデルであり、すべてのクラスに SP プレフィックスが付いているわけではありません。

理想的には、フォルダーへの参照をどこで取得しているのかを知る必要があるという質問に答えるには? サイト、Web リスト?または、なぜフォルダーを列挙しようとしていますか?

FolderCollection は、クライアント オブジェクト モデルのどこかにあるオブジェクトから取得する必要があります。

たとえば、ctx.Web.Folders は、単に新しい FolderCollection を作成するのではなく、列挙可能な FolderCollection を返します。

通常、Web や List などのより高いレベルのオブジェクトには、CAML を使用せずにフォルダーのリストを取得できる .Folders プロパティがあります。

このコードを使用してみてください。

        ClientContext ctx = new ClientContext("http://yoururl");

        var webFolders = ctx.Web.Folders;
        ctx.Load(webFolders);
        ctx.Load(ctx.Web.Folders, folders => folders.Include(folder => folder.ParentFolder));
        ctx.Load(ctx.Web.Folders, folders => folders.Include(folder => folder.Folders));

        ctx.ExecuteQuery();
        foreach (var folder in webFolders)
        {
           // Do stuff here!
        }

Web からすべてのフォルダー (実質的にはルート フォルダー) とその親と子を読み込みます。効率的な方法でフォルダーを非表示にする方法については、まだ迷っています。

コードの実行が遅いと思う理由については、私のコメントを参照してください。

編集:

これを試して、Web 内のすべてのドキュメント ライブラリを取得できます。

        var webLists = ctx.Web.Lists;
        ctx.Load(webLists);

        // request that List.RootFolder is returned
        ctx.Load(ctx.Web.Lists, lists => lists.Include(list => list.RootFolder ));
        // request that RootFolder.Folders is returned
        ctx.Load(ctx.Web.Lists, lists => lists.Include(list => list.RootFolder.Folders ));
        // only return lists with a BaseType of 101 (Document Library)
        ctx.Load(ctx.Web.Lists, lists => lists.Where(list => list.BaseTemplate == 101));

        ctx.ExecuteQuery();
        foreach (var list in webLists)
        {
            var rootFolder = list.RootFolder;
            // Do stuff here!
        }
于 2013-03-09T12:22:31.430 に答える