C# 以编程方式更改Sharepoint 2007列表中的字段顺序
我正在通过一个功能以编程方式将两个新字段添加到现有的Sharepoint列表中。已成功添加字段,但我无法调整列顺序 这项任务只需通过UI来完成,先是列表设置,然后是列排序,但我无法通过编程实现这项任务 通过一些研究,我发现您可以使用表单的SPContentType更改FieldLink的顺序,如下所示: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
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();