1

機能を使用して、既存の SharePoint リストに 2 つの新しいフィールドをプログラムで追加しています。フィールドは正常に追加されていますが、列の順序を調整できませんでした。

このタスクは、UI から [List Settings]、[Column Ordering] の順に移動するだけで簡単に実行できますが、このタスクをプログラムで実行することはできませんでした。

いくつかの調査を通じて、フォームの 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();
}

この例では、リストに既に「例 1」と「例 3」の列があり、後で「例 2」を追加してから並べ替えます。

しかし、このアプローチは私にはうまくいきませんでした。

私が見た次の項目は、リストの SchemaXml を手動で変更してフィールドの順序を適切にすることですが、これが最善の方法であるかどうかを確認したかったのです。

任意の入力をいただければ幸いです。ご協力いただきありがとうございます。

4

3 に答える 3

2

列の順序付けページ (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 がパントしている場合は良い感じがしません。

于 2010-10-14T22:18:40.250 に答える
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;

これで、リストに含まれるコンテンツ タイプの数と、リスト内のフィールドがわかりました。

既定では、コンテンツ タイプ管理が有効になっていない場合、すべてのフィールドを持つ 1 つのコンテンツ タイプが作成されます。

上記のコードからのサンプル出力:

コンテンツ タイプ:イベント、フィールド:

"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;
                }
于 2012-10-22T07:26:09.170 に答える