Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式生成的查找字段“原因”;System.ArgumentException:值不在预期范围内;创建新项目时_C#_Sharepoint 2010_Lookupfield - Fatal编程技术网

C# 以编程方式生成的查找字段“原因”;System.ArgumentException:值不在预期范围内;创建新项目时

C# 以编程方式生成的查找字段“原因”;System.ArgumentException:值不在预期范围内;创建新项目时,c#,sharepoint-2010,lookupfield,C#,Sharepoint 2010,Lookupfield,我创建了一个内容类型TypeA,它有一个到基本ListB的查找字段。然后我创建了一个使用TypeA的ListA。一切都是以编程方式创建的 当ListA的“添加新项”模式应该加载时引发异常。它只在ListB中包含项时发生。如果ListB为空,listA的“添加新项目”模式将加载,ListB的查找字段将正确显示(无) 堆栈跟踪: System.ArgumentException: Value does not fall within the expected range. at Microsoft

我创建了一个内容类型TypeA,它有一个到基本ListB的查找字段。然后我创建了一个使用TypeA的ListA。一切都是以编程方式创建的

当ListA的“添加新项”模式应该加载时引发异常。它只在ListB中包含项时发生。如果ListB为空,listA的“添加新项目”模式将加载,ListB的查找字段将正确显示
(无)

堆栈跟踪:

System.ArgumentException: Value does not fall within the expected range.

at Microsoft.SharePoint.SPFieldMap.GetColumnNumber(String strFieldName, Boolean bThrow)
at Microsoft.SharePoint.SPListItemCollection.GetColumnNumber(String groupName, Boolean bThrowException)
at Microsoft.SharePoint.SPListItemCollection.GetRawValue(String fieldname, Int32 iIndex, Boolean bThrow)
at Microsoft.SharePoint.SPListItem.GetValue(SPField fld, Int32 columnNumber, Boolean bRaw, Boolean bThrowException)
at Microsoft.SharePoint.SPListItem.GetValue(String strName, Boolean bThrowException)
at Microsoft.SharePoint.SPListItem.get_Item(String fieldName)
at Microsoft.SharePoint.WebControls.LookupField.get_DataSource()
at Microsoft.SharePoint.WebControls.LookupField.CreateChildControls()
at System.Web.UI.Control.EnsureChildControls()
at Microsoft.SharePoint.WebControls.BaseFieldControl.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    private SPContentType createContentType(SPSite site, string typeName, string groupName, string parentTypeName, string[] fields) {
        try {
            SPContentType testExist = site.RootWeb.ContentTypes[typeName];
            if (testExist != null)
                return testExist;
        }
        catch { }

        SPContentType parentType = site.RootWeb.ContentTypes[parentTypeName];

        SPContentType contentType = new SPContentType(parentType, site.RootWeb.ContentTypes, typeName);
        contentType.Group = groupName;

        foreach (string field in fields) {
            contentType.FieldLinks.Add(new SPFieldLink(site.RootWeb.GetField(field)));
        }
        contentType.FieldLinks["Title"].Required = false;
        contentType.FieldLinks["Title"].Hidden = true;

        site.RootWeb.ContentTypes.Add(contentType);
        contentType.Update();
        return contentType;
    }

    public SPFieldLookup createLookupField(string fieldName, string groupName, Guid listGuid, string lookupField, bool allowMultipleValues, bool isRequired) {
        if (site.RootWeb.Fields.ContainsField(fieldName))
            return null;
        string internalName = site.RootWeb.Fields.AddLookup(fieldName, listGuid, isRequired);
        SPFieldLookup lookup = site.RootWeb.Fields.GetFieldByInternalName(internalName) as SPFieldLookup;
        lookup.AllowMultipleValues = allowMultipleValues;
        lookup.LookupField = lookupField;
        lookup.Group = groupName;
        lookup.Update();
        return lookup;
    }

    public SPList createList(string listName, string description, SPContentType contentType) {

        if (web.Lists.TryGetList(listName) != null)
            web.Lists[listName].Delete();
        Guid newListGuid = web.Lists.Add(listName, description, SPListTemplateType.GenericList);
        SPList newList = web.Lists[newListGuid];
        newList.OnQuickLaunch = true;
        newList.Update();

        newList.ContentTypesEnabled = true;
        SPContentType newType = newList.ContentTypes.Add(contentType);
        newList.Update();
        newList.ContentTypes["Item"].Delete();
        newList.Update();
        newList.Fields["Title"].Required = false;
        newList.Fields["Title"].Hidden = true;
        newList.Fields["Title"].Update();

        SPView view = newList.DefaultView;
        foreach (SPField field in newType.Fields) {
            view.ViewFields.Add(field);
        }
        view.ViewFields.Delete("Title");
        view.ViewFields.Delete("LinkTitle");
        view.ViewFields.Delete("ContentType");
        view.Update();

        return newList;
    }
我用于创建内容类型、列表和查找字段的方法:

System.ArgumentException: Value does not fall within the expected range.

at Microsoft.SharePoint.SPFieldMap.GetColumnNumber(String strFieldName, Boolean bThrow)
at Microsoft.SharePoint.SPListItemCollection.GetColumnNumber(String groupName, Boolean bThrowException)
at Microsoft.SharePoint.SPListItemCollection.GetRawValue(String fieldname, Int32 iIndex, Boolean bThrow)
at Microsoft.SharePoint.SPListItem.GetValue(SPField fld, Int32 columnNumber, Boolean bRaw, Boolean bThrowException)
at Microsoft.SharePoint.SPListItem.GetValue(String strName, Boolean bThrowException)
at Microsoft.SharePoint.SPListItem.get_Item(String fieldName)
at Microsoft.SharePoint.WebControls.LookupField.get_DataSource()
at Microsoft.SharePoint.WebControls.LookupField.CreateChildControls()
at System.Web.UI.Control.EnsureChildControls()
at Microsoft.SharePoint.WebControls.BaseFieldControl.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    private SPContentType createContentType(SPSite site, string typeName, string groupName, string parentTypeName, string[] fields) {
        try {
            SPContentType testExist = site.RootWeb.ContentTypes[typeName];
            if (testExist != null)
                return testExist;
        }
        catch { }

        SPContentType parentType = site.RootWeb.ContentTypes[parentTypeName];

        SPContentType contentType = new SPContentType(parentType, site.RootWeb.ContentTypes, typeName);
        contentType.Group = groupName;

        foreach (string field in fields) {
            contentType.FieldLinks.Add(new SPFieldLink(site.RootWeb.GetField(field)));
        }
        contentType.FieldLinks["Title"].Required = false;
        contentType.FieldLinks["Title"].Hidden = true;

        site.RootWeb.ContentTypes.Add(contentType);
        contentType.Update();
        return contentType;
    }

    public SPFieldLookup createLookupField(string fieldName, string groupName, Guid listGuid, string lookupField, bool allowMultipleValues, bool isRequired) {
        if (site.RootWeb.Fields.ContainsField(fieldName))
            return null;
        string internalName = site.RootWeb.Fields.AddLookup(fieldName, listGuid, isRequired);
        SPFieldLookup lookup = site.RootWeb.Fields.GetFieldByInternalName(internalName) as SPFieldLookup;
        lookup.AllowMultipleValues = allowMultipleValues;
        lookup.LookupField = lookupField;
        lookup.Group = groupName;
        lookup.Update();
        return lookup;
    }

    public SPList createList(string listName, string description, SPContentType contentType) {

        if (web.Lists.TryGetList(listName) != null)
            web.Lists[listName].Delete();
        Guid newListGuid = web.Lists.Add(listName, description, SPListTemplateType.GenericList);
        SPList newList = web.Lists[newListGuid];
        newList.OnQuickLaunch = true;
        newList.Update();

        newList.ContentTypesEnabled = true;
        SPContentType newType = newList.ContentTypes.Add(contentType);
        newList.Update();
        newList.ContentTypes["Item"].Delete();
        newList.Update();
        newList.Fields["Title"].Required = false;
        newList.Fields["Title"].Hidden = true;
        newList.Fields["Title"].Update();

        SPView view = newList.DefaultView;
        foreach (SPField field in newType.Fields) {
            view.ViewFields.Add(field);
        }
        view.ViewFields.Delete("Title");
        view.ViewFields.Delete("LinkTitle");
        view.ViewFields.Delete("ContentType");
        view.Update();

        return newList;
    }
示例

SPContentType typeB = createContentType(site, "Type B", "My Group", "Item", new string[] {"Salary"});
SPList listB = createList("List B", "my list b", typeB);
SPFieldLookup lookupB = createLookupField("B", "My Group", listB.ID, "Salary", false, false);
SPContentType typeA = createContentType(site, "Type A", "My Group", "Item", new string[] {"Name", "B"});
SPList listA = createList("List A", "my list a", typeA);

SPFieldLookup.LookupField
属性需要字段的内部名称

解决方案是进行以下更改(在示例中):