Программно изменяющийся порядок полей в списке Sharepoint 2007
Я добавляю два новых поля в уже существующий список Sharepoint программно через функцию. Поля добавляются успешно, но мне не удалось настроить порядок столбцов.
Эта задача выполняется просто через пользовательский интерфейс. Для этого перейдите в "Параметры списка" и "Порядок столбцов", но мне не удалось выполнить задачу программным путем.
В ходе некоторых исследований я видел, что вы можете использовать SPContentType формы для изменения порядка FieldLinks (как показано ниже):
SPList list = web.Lists["Example List"];
if (list.ContentTypes.Count > 0) {
SPContentType ct = list.ContentTypes[0];
string[] names = {"Example_x0020_One", "Example_x0020_Two", "Example_x0020_Three"};
ct.FieldLinks.Reorder(names);
ct.Update();
}
В этом примере в списке уже будут столбцы "Пример один" и "Пример три", и я добавлю "Пример два" позже, а затем попробую упорядочить их.
Однако этот подход не сработал для меня, поэтому, если кто-то внесет свой вклад, это будет оценено.
Следующий элемент, который я увидел, - это изменение вручную SchemaXml списка, чтобы он имел правильный порядок полей, но я хотел посмотреть, был ли это лучший метод.
Любой вклад будет оценен, спасибо за вашу помощь.
3 ответа
Я взглянул на источник страницы заказа Column (formEdt.aspx), похоже, они используют веб-сервисы, а не объектную модель:
function DoBuildAndSubmit()
{
var numFound, currentSelect, selectValue;
var form = document.forms.aspnetForm;
var numFields = form["numSelects"].value;
var xml = "<Fields>";
numFound = 0;
while(numFound < numFields)
{
for(x = 0; x < numFields; x++)
{
currentSelect = form["FormPosition" + x];
if(currentSelect.selectedIndex == numFound)
{
selectValue = currentSelect.options[numFound].value;
xml = xml + "<Field Name=\"" + selectValue + "\"/>" + "\n";
numFound++;
}
}
}
for(x = numFields ; x < 67; x++)
xml = xml + "<Field Name=\"" + form["FormPosition" + x].value + "\"/>" + "\n";
xml = xml + "</Fields>";
document.frmLayoutSubmit["ReorderedFields"].value=xml;
document.frmLayoutSubmit.action = "http://local/_vti_bin/owssvr.dll?CS=65001";
document.frmLayoutSubmit.submit();
}
Теперь, возможно, это можно сделать с помощью объектной модели, но у меня нет хорошего представления об этом, когда пользовательский интерфейс загружается.
Вот версия PowerShell:
# Moves "FieldToBeMoved" after "Description" field
$list = $web.Lists["Documents"]
$ct = $list.ContentTypes[0] # Or find the desired CT
$newOrder = @()
foreach ($field in $ct.Fields)
{
if ($field.StaticName -ne "FieldToBeMoved")
{
$newOrder += $field.StaticName
}
if ($field.StaticName -eq "Description")
{
$newOrder += "FieldToBeMoved"
}
}
$ct.FieldLinks.Reorder($newOrder)
$ct.Update();
Я использовал код из вашего ответа, за исключением того, что я программно исследовал типы контента и поля для списка, который я хотел изменить.
// Шаг 1 (необязательно): перечислите типы контента и поля для вашего списка, чтобы увидеть, что в списке
SPList list = web.Lists[strListName];
string strRet="";
foreach (SPContentType spct in list.ContentTypes)
{
strRet += "<strong>Content Type: </strong>" + spct.Name + ", <strong>Fields</strong>: <br />";
foreach (SPField field in spct.Fields)
{
if (strFieldInfo != "")
{
strFieldInfo += ", ";
}
strFieldInfo += "\"" + field.StaticName + "\"";
}
strRet += strFieldInfo + "<br />-----<br />";
}
//Output the results
lblOutput.Text = strRet;
Теперь у вас есть представление о том, сколько типов контента есть в вашем списке и какие поля в списке.
По умолчанию, если управление типами контента не включено, у вас будет один тип контента со всеми полями.
Пример вывода из приведенного выше кода:
Тип содержимого: Событие, Поля:
"ContentType", "Title", "Location", "EventDate", "EndDate", "Description", "fAllDayEvent", "fRecurrence", "WorkspaceLink", "EventType", "UID", "RecurrenceID", "EventCanceled" ", "Duration", "RecurrenceData", "TimeZone", "XMLTZone", "MasterSeriesItemID", "Workspace", "Course", "CourseLocation"
Следующим шагом 2 является изменение порядка типа контента. Вы можете вырезать и вставлять результаты из шага 1, изменить их порядок и добавить "{" и "};" вокруг него, чтобы создать массив строк для того порядка, который вы хотите.
if (list.ContentTypes.Count > 0)
{
SPContentType ct = list.ContentTypes[0]; //Specify the content type here, if you have more than one content type in your list.
string[] fieldnames = { "ContentType", "Title", "Course", "CourseLocation", "EventDate", "EndDate", "Description", "fAllDayEvent", "fRecurrence", "WorkspaceLink", "EventType", "UID", "RecurrenceID", "EventCanceled", "Duration", "RecurrenceData", "TimeZone", "XMLTZone", "MasterSeriesItemID", "Workspace", "Location"};
ct.FieldLinks.Reorder(fieldnames);
web.AllowUnsafeUpdates = true;
ct.Update(true);
web.AllowUnsafeUpdates = false;
}