以编程方式更改Sharepoint 2007列表中的字段顺序

时间:2010-10-14 19:14:27

标签: c# sharepoint spfield splist

我通过一个功能以编程方式将两个新字段添加到已存在的Sharepoint列表中。这些字段已成功添加,但我无法调整列顺序。

此任务只需通过UI进行列表设置然后进行列排序即可完成,但我无法以编程方式完成任务。

通过一些研究,我发现你可以使用表单的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 个答案:

答案 0 :(得分:2)

我看了一下Column排序页面的来源(formEdt.aspx),看起来他们使用的是web服务,而不是对象模型:

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();
}

现在,可能可以通过对象模型完成,但是当UI正在发挥作用时,我对它没有很好的感觉。

答案 1 :(得分:2)

这是一个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 :(得分:0)

我使用了你答案中的代码,除了我以编程方式检查了我想要重新排序的列表的内容类型和字段。

//步骤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”,“工作区”,“课程”,“CourseLocation”

下一步是更改内容类型的顺序。您可以从步骤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;
                }