Программно меняющийся порядок полей в списке Sharepoint 2007 - PullRequest
1 голос
/ 14 октября 2010

Я добавляю два новых поля в уже существующий список 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 ]

2 голосов
/ 04 июня 2014

Вот версия 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();
2 голосов
/ 15 октября 2010

Я взглянул на источник страницы заказа 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();
}

Теперь, возможно, будет возможноделать через объектную модель, но у меня нет хорошего представления об этом, когда пользовательский интерфейс загружается.

0 голосов
/ 22 октября 2012

Я использовал код из вашего ответа, за исключением того, что я программно исследовал типы контента и поля для списка, который я хотел изменить.

// Шаг 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;
                }
...