0

指定したリストに追加して動作させましたが、サイトコレクション内のすべてのリストを調べたいと思います。何が原因でこれが機能しないのかわかりません。

1つのリストで機能するコード:

    void btnAdd_Click(object sender, EventArgs e)
    {
        try
        {
            using (SPSite site = new SPSite("http://asdf:150/sites/test"))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    SPList list = web.Lists["test8"];

                    //Needed?
                    site.AllowUnsafeUpdates = true;
                    web.AllowUnsafeUpdates = true;

                    string mainLocation = list.Fields.Add("New Field", SPFieldType.Text, false, false, null);
                    readOnly(list, mainLocation);

                    //Add to default view (will be removed after testing)
                    SPView view = list.DefaultView;
                    defaultView(view, "New Field");
                }
            } 
        }
        catch (Exception ex)
        {
        }
    }

サイトコレクションのすべてのリストにフィールドを追加したいのですが、何が間違っているのかわかりません。これが今のところです。

void btnAdd_Click(object sender, EventArgs e)
        {
            using (SPSite site = new SPSite("http://asdf:150/sites/test"))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    //Needed?
                    site.AllowUnsafeUpdates = true;
                    web.AllowUnsafeUpdates = true;
                    try
                    {
                        SPListCollection lists = web.Lists; // ??
                        foreach (SPList list in lists)
                        {
                            string mainLocation = list.Fields.Add("New Field", SPFieldType.Text, false, false, null);
                            readOnly(list, mainLocation);

                            //Add to default view (will be removed after testing)
                            SPView view = list.DefaultView;
                            defaultView(view, "New Field");
                        }
                    }
                    catch (Exception)
                    {
                        // some exception handling
                    }
                    finally
                    {
                        //web.Dispose();
                    }
                }
            }
        }

ヘルパーメソッド

void readOnly(SPList list, string name)
{
    SPField listField = list.Fields.GetFieldByInternalName(name);
    listField.ReadOnlyField = true;
    listField.Update();
}

void defaultView(SPView view, string field)
{
    view.ViewFields.Add(field);
    view.Update();
}

あなたの誰かがここで私より賢いことを願っています:)

4

2 に答える 2

0

私が最初に見つけたのは、サイトコレクションのルートSPWeb内のすべてのリストのみをチェックしているということです。

ルートSPWebには、反復処理する必要のある子SPWebを含めることもできます。

それとは別に、正確に機能していない、または「間違っている」ものを指定すると役立ちますか?

于 2012-09-27T12:05:19.507 に答える
0

私はあなたのコードを実行します、そしてあなたは2つの主な問題を抱えています。1.一部のリストでは、デフォルトのビューがnullになる場合があります。だからあなたはそれをチェックする必要があります。

SPView view = list.DefaultView;
if(view != null)
{
    defaultView(view, "New Field");
}

2.リストに変更を加えると、SPListCollectionが変更されます。リストを反復処理するための一時的なIEnumerableが必要です。

using System.Linq;

SPListCollection listCollection = web.Lists;
IEnumerable<SPList> lists = listCollection.Cast<SPList>();
foreach (SPList list in lists)
{

3.Excaptionsを無視しないでください。ブロックをキャッチするためのコードを追加します。これは役に立ちます。

catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
于 2012-09-27T12:14:07.423 に答える