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

C# 以编程方式更改Sharepoint 2007列表中的字段顺序,c#,sharepoint,spfield,splist,C#,Sharepoint,Spfield,Splist,我正在通过一个功能以编程方式将两个新字段添加到现有的Sharepoint列表中。已成功添加字段,但我无法调整列顺序 这项任务只需通过UI来完成,先是列表设置,然后是列排序,但我无法通过编程实现这项任务 通过一些研究,我发现您可以使用表单的SPContentType更改FieldLink的顺序,如下所示: SPList list = web.Lists["Example List"]; if (list.ContentTypes.Count > 0) { SPContentType

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

这项任务只需通过UI来完成,先是列表设置,然后是列排序,但我无法通过编程实现这项任务

通过一些研究,我发现您可以使用表单的SPContentType更改FieldLink的顺序,如下所示:

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();
}
在本例中,我希望列表中已经有示例1和示例3列,稍后我将添加示例2,然后尝试对它们进行排序

然而,这种方法对我不起作用,所以如果有人对此有意见,我们将不胜感激

我看到的下一项是手动更改列表的SchemaXml,使其具有正确的字段顺序,但我想看看这是否是最好的方法


如果您有任何意见,我们将不胜感激,谢谢您的帮助。

我查看了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();
}

现在,可能可以通过对象模型进行操作,但当用户界面在下注时,我感觉不太好。

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

//步骤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;

以下是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();

尝试使用简单的字段名,例如无空格/编码。还要确保您正在取回一些CT等。已验证我正在取回CT,但由于某些原因,重新订购步骤不起作用。使用列表的第一个ContentType是默认的吗?哇。。。想不到。。。我会试试看,让你知道进展如何。
# 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();