Como reordenar os campos de uma lista de SharePoint programaticamente

Numa lista de SharePoint, quando a opção “Allow management of content types” está activa, é possível alterar a ordem dos campos através da IU. Isto irá afectar a ordem dos campos em formulários e quando se visiona um item da lista. No entanto, se quiserem fazer isto programaticamente, a Microsoft não fornece uma forma padrão de o fazer através do modelo de objectos. Apesar disso, é possível fazê-lo através de uma RPC.

Para um content type, é possível alterar a ordem dos seus campos com o método SPFieldLinkCollection.Reorder. Para listas, no entanto, não existe um método similar.

É necessário fazer uma RPC, como no método seguinte, para reordenar programaticamente os campos de uma lista de SharePoint.

public void ReorderFields(SPList list, string[] internalNames) {
    StringCollection fields = new StringCollection();
    fields.AddRange(internalNames);
    
    foreach (SPField field in list.Fields) {
        if (!fields.Contains(field.InternalName)) {
            fields.Add(field.InternalName);
        }
    }
    StringBuilder sb = new StringBuilder();
    XmlTextWriter xmlWriter = new XmlTextWriter(new StringWriter(sb));
    xmlWriter.Formatting = Formatting.Indented;
    xmlWriter.WriteStartElement("Fields");
    
    for (int i = 0; i < fields.Count; i++) {
        xmlWriter.WriteStartElement("Field");
        xmlWriter.WriteAttributeString("Name", fields[i]);
        xmlWriter.WriteEndElement();
    }
    xmlWriter.WriteEndElement();
    xmlWriter.Flush();
    string rpcTemplate = @"<?xml version=""1.0"" encoding=""UTF-8""?>  
        <Method ID=""0,REORDERFIELDS"">  
        <SetList Scope=""Request"">{0}</SetList>  
        <SetVar Name=""Cmd"">REORDERFIELDS</SetVar>  
        <SetVar Name=""ReorderedFields"">{1}</SetVar>  
        <SetVar Name=""owshiddenversion"">{2}</SetVar>  
        </Method>";
    string rpcCall = string.Format(
        rpcTemplate,
        list.ID,
        SPHttpUtility.HtmlEncode(sb.ToString()),
        list.Version);
    list.ParentWeb.AllowUnsafeUpdates = true;
    list.ParentWeb.ProcessBatchData(rpcCall);
    list.ParentWeb.AllowUnsafeUpdates = false;
}

O primeiro parâmetro é a instância da lista e o segundo um vector de strings com os nomes internos dos campos pela ordem desejada.

O método irá adicionar à colecção os campos da lista que estejam em falta. Depois irá construir a CAML para o comando de reorganizar os campos. No final irá executar o comando através do método ProcessBatchData da web mãe da lista.

Nuno Freitas
Publicado por Nuno Freitas em 23 setembro, 2013

Artigos relacionados