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.