SPFolder vs SPListItem
-
09-12-2019 - |
Pergunta
Estou tentando construir uma visualização em árvore que mostre listas e pastas de sites.Este é um aplicativo externo, então preciso me comunicar com o WSS3 por meio de serviços da web.
Site
|-List
| |-Folder
| |-Folder
| |-Folder
|
|-List
| |-Folder
|
|-List
Consegui detalhar meu SPWeb.Lists
objeto para obter o SPListCollection
.Contudo a partir do SPList.Folders
coleção você recebe o SPListItemCollection
, não SPFolderCollection
.Não parece haver uma propriedade para objetos filhos no SPList
objeto.
Como você não pode lançar SPListItem
para SPFolder
Eu tenho o SPFolderCollection
diretamente de SPWeb.Folders
em vez disso, mas isso parece retornar coisas estranhas.
Eu tenho uma lista chamada "Desenvolvedor" que contém uma pasta chamada "Primeiro" que possui uma subpasta chamada "Mais profundo".
Este é o método recursivo que escrevi para criar nós para as pastas.
private TreeNode[] CreateBranch(SPFolder folder)
{
if (folder.SubFolders.Count > 0)
{
List<TreeNode> branchList = new List<TreeNode>();
TreeNode child;
foreach (SPFolder item in folder.SubFolders)
{
if (item.SubFolders.Count > 0)
// Start recursion
child = new TreeNode(item.Name, CreateBranch(item));
else
child = new TreeNode(item.Name);
// Collect folders
branchList.Add(child);
}
return branchList.ToArray();
}
return null;
}
Isso cria uma árvore para mim, como deveria, mas as subpastas das pastas não parecem aparecer na coleção como um loop por ela.A lista “Desenvolvedor” também apareceu como uma pasta, assim como os diretórios web.
Isso me deixou um pouco confuso sobre qual coleção devo usar e como devo saber se uma pasta possui subpastas.Alguém pode me ajudar a apontar a direção certa?
Solução
Esta é uma resposta e tanto, mas mais um comentário que não cabia no espaço permitido para comentários ...
Parece que você deseja exibir as listas e depois as pastas nessas listas.Isso não é o mesmo que exibir as pastas de um site.
SPWeb.Folders retorna a lista de pastas na raiz de um site do SharePoint.Pense neles como 'caminhos de URL' que existem no site.Sua lista de 'Desenvolvedores' (uma biblioteca de documentos, presumo?) está acessível como http://site/Developer/
, é por isso que aparece como uma lista e uma pasta.SPFolder.SubFolders deve retornar pastas de nível inferior.
Você provavelmente está atrás das pastas de uma lista específica.SPList.Folders retorna todas as pastas de uma lista.Para uma lista, uma pasta é apenas um item com tipo de conteúdo 'Pasta', e é por isso que retorná-la como SPListItemCollection não é tão estranho.Cada SPListItem possui uma propriedade SPFolder, mas não acho que você precise disso.Observe que SPList.Folders retorna todas as pastas da lista (recursivamente).
Conforme apontado acima por Kit Menke, seu código parece usar o modelo de objeto servidor, obtendo as informações de serviços web não é exatamente a mesma coisa, mas ajudará primeiro a entender o modelo de objeto e usá-lo para descobrir o que você deseja exibir.
Outras dicas
Encontrei este artigo enquanto procurava uma função para obter todas as pastas de uma determinada biblioteca de documentos como uma árvore.Devido a alguns erros no método recursivo mostrado pelo Amicable reescrevi o método.Pode ser útil para outros:
A função recursiva:
private void CreateBranch(SPFolder folder, TreeNode tnParent)
{
if (folder.SubFolders.Count > 0)
{
foreach (SPFolder item in folder.SubFolders)
{
TreeNode child = new TreeNode(item.Name);
if (item.SubFolders.Count > 0)
{
// Start recursion
CreateBranch(item, child);
}
tnParent.ChildNodes.Add(child);
}
}
}
Chame a função:
SPFolder listRootFolder = SPContext.Current.Web.Lists["Shared Documents"].RootFolder;
TreeNode parentNode = new TreeNode("root");
CreateBranch(listRootFolder, parentNode);