SPFieldLookup 类
表示一个查阅字段。
继承层次结构
System.Object
Microsoft.SharePoint.SPField
Microsoft.SharePoint.SPFieldLookup
Microsoft.SharePoint.Applications.GroupBoard.SPFieldFacilities
Microsoft.SharePoint.SPFieldUser
命名空间: Microsoft.SharePoint
程序集: Microsoft.SharePoint(位于 Microsoft.SharePoint.dll 中)
语法
声明
Public Class SPFieldLookup _
Inherits SPField
用法
Dim instance As SPFieldLookup
public class SPFieldLookup : SPField
备注
查阅字段从其他列表中的字段中获取其值。为查阅字段提供数据的列表称为查阅列表。若要获取对查阅列表的引用,请访问SPFieldLookup对象的LookupList属性。若要确定哪个字段查阅列表中的提供的信息,请访问LookupField属性。
备注
SPFieldLookup类对应于通过Type属性的字段元素的声明性 XML 中指定的Lookup数据类型。Field元素的List属性对应于SPFieldLookup类的LookupList属性。
尽管SPFieldLookup类没有构造函数,但它通常会更方便地调用SPFieldCollection类的AddLookup方法。AddLookup方法具有可用于从一个到另一个网站中的列表创建查找您在其中创建SPFieldLookup对象的重载。
Microsoft SharePoint Foundation支持多列搜索。在这种情况下,主列建立与查阅列表之间的关系,通过指向目标列表中的字段以及一个或多个辅助列指向目标列表中的其他字段。通过调用AddDependentLookup方法的SPFieldCollection类,可以创建查阅字段中的为第二列。第二列中,将IsDependentLookup属性返回true。主列, IsDependentLookup返回false和IsRelationship属性返回值true。
SharePoint Foundation支持通过使查找字段,从而设置查阅列表上的删除约束列表项的引用完整性。通过RelationshipDeleteBehavior属性,它采用下列SPRelationshipDeleteBehavior枚举值之一执行此操作:
Cascade。从查阅列表中删除某一项会导致所有相关的项,要从包含查阅字段的列表中删除。
Restrict。防止查阅列表上的项目被删除,如果相关的项目存在于包含查阅字段的列表。
None。无约束 (默认值)。
为了指定Cascade或Restrict,用户必须具有SPBasePermissions。ManageLists在查阅列表上的权限。此外, Cascade和Restrict都需要查阅字段编制索引。之前将RelationshipDeleteBehavior属性设置为上述任一值,首先将Indexed属性设置为true。
备注
您不能设置允许多个值的查阅字段的删除约束,也不可能,如果是另一个 Web 站点中的查阅列表。
在SharePoint Foundation,在相关列表中的查阅字段是从SPList类的GetRelatedFields()方法,通过查阅列表 (查找目标) 被发现。GetRelatedFields方法的重载时,对于查找字段,指定特定删除约束,您可以筛选。
Lookup Field Values
默认情况下,查阅字段包含一个值。在这种情况下,该字段值是一个对象的类型String,和的字符串具有以下格式:
Id;#Value
Id为查阅字段指向列表项的标识符。值为查阅字段指向字段的值。";#"的字符分隔的字符串的两个部分。如果值包含分号 (;),它会被转义,用分号 (";")。
如果指向第三个列表项,指向查阅字段的字段值的查阅字段例如,是"我 gnaw 上旧轮胎 ;它增强了我 jaw",则下面的字符串将返回:
3;#I gnaw on old tires;;it strengthens my jaw
您可以分析此字符串,也可以到SPFieldLookupValue对象的构造函数作为参数传递它。可以从LookupValue属性的列表项从一个SPFieldLookupValue对象, LookupId属性和字段中的值获取的列表项的标识符。
如果AllowMultipleValues属性返回true,查阅字段可以具有多个值。在这种情况下,字段值是 _z2z_ 的一个对象的类型被装箱为ObjectSPFieldLookupValueCollection 。您可以通过首先将原始字段值转换为SPFieldLookupValueCollection ,然后再枚举集合中的SPFieldLookupValue对象获取的所有值。
针对继承者的注释
在SharePoint Foundation,基于自定义字段类型的列是只读,在数据表视图中。
示例
下面的示例是一个控制台应用程序创建客户列表和待处理订单列表之间的关系。应用程序调用AddLookup方法来添加一个名为待处理订单列表中的客户 ID 的主查找字段,并指向在客户列表中的 ID 字段的字段。新的客户 ID 字段编制索引,并将设置为限制查阅列表中的删除。
在创建后主查找字段,该应用程序创建三个辅助字段,名为名字、 姓氏和电话。应用程序通过调用AddDependentLookup方法的对象,它表示的待处理订单列表的字段集合中创建这些字段。
using System;
using Microsoft.SharePoint;
namespace RelatedLists
{
class Program
{
static void Main(string[] args)
{
using (SPSite siteCollection = new SPSite("https://localhost"))
{
using (SPWeb site = siteCollection.OpenWeb())
{
SPList lookupList = site.Lists.TryGetList("Customers");
SPList relatedList = site.Lists.TryGetList("Pending Orders");
if (lookupList != null && relatedList != null)
{
// Create the primary column.
string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);
primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
primaryCol.Indexed = true;
primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
primaryCol.Update();
// Create the secondary columns.
string strFirstNameCol = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id);
SPFieldLookup firstNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strFirstNameCol);
firstNameCol.LookupField = lookupList.Fields["First Name"].InternalName;
firstNameCol.Update();
string strLastNameCol = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id);
SPFieldLookup lastNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strLastNameCol);
lastNameCol.LookupField = lookupList.Fields["Last Name"].InternalName;
lastNameCol.Update();
string strPhoneCol = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id);
SPFieldLookup phoneCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPhoneCol);
phoneCol.LookupField = lookupList.Fields["Phone"].InternalName;
phoneCol.Update();
}
}
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
}
}
Imports System
Imports Microsoft.SharePoint
Module ConsoleApp
Sub Main()
Using siteCollection As New SPSite("https://localhost")
Using site As SPWeb = siteCollection.OpenWeb()
Dim lookupList As SPList = site.Lists.TryGetList("Customers")
Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")
If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then
' Create the primary column.
Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
Dim primaryCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)
primaryCol.LookupField = lookupList.Fields("ID").InternalName
primaryCol.Indexed = True
primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
primaryCol.Update()
' Create the secondary columns.
Dim strFirstNameCol As String = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id)
Dim firstNameCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strFirstNameCol), SPFieldLookup)
firstNameCol.LookupField = lookupList.Fields("First Name").InternalName
firstNameCol.Update()
Dim strLastNameCol As String = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id)
Dim lastNameCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strLastNameCol), SPFieldLookup)
lastNameCol.LookupField = lookupList.Fields("Last Name").InternalName
lastNameCol.Update()
Dim strPhoneCol As String = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id)
Dim phoneCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strPhoneCol), SPFieldLookup)
phoneCol.LookupField = lookupList.Fields("Phone").InternalName
phoneCol.Update()
End If
End Using
End Using
Console.Write(vbLf & "Press ENTER to continue...")
Console.ReadLine()
End Sub
End Module
下一个示例演示了如何解释查阅字段的值。
此代码示例查找问题列表中网站集的根网站。因为它有多个查找字段,此处选择的问题列表类型。通过选择另一种列表类型,您可以修改此示例。在找到列表,本示例先选定此列表中的字段集合中找到第一个查阅字段。然后代码循环访问列表项,每个项目的查阅字段的值有关的打印信息。
using System;
using Microsoft.SharePoint;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://localhost"))
{
using (SPWeb web = site.RootWeb)
{
SPList list = null;
foreach (SPList webList in web.Lists)
{
if (webList.BaseType == SPBaseType.Issue)
{
list = webList;
break;
}
}
if (list != null)
{
Guid fieldId = Guid.Empty;
foreach (SPField field in list.Fields)
{
if (field is SPFieldLookup)
{
fieldId = field.Id;
break;
}
}
if (fieldId != Guid.Empty)
{
SPFieldLookup lookupField = list.Fields[fieldId] as SPFieldLookup;
Console.WriteLine("Lookup field: {0}", lookupField.Title);
foreach (SPListItem item in list.Items)
{
object rawValue = item[fieldId];
if (rawValue != null)
{
Console.WriteLine("\nItem: {0}. {1}", item.ID, item.Title);
Console.WriteLine("Raw value: {0}", rawValue);
if (lookupField.AllowMultipleValues)
{
SPFieldLookupValueCollection values = item[fieldId] as SPFieldLookupValueCollection;
foreach (SPFieldLookupValue value in values)
{
PrintValue(value);
}
}
else
{
SPFieldLookupValue value = new SPFieldLookupValue(rawValue.ToString());
PrintValue(value);
}
}
}
}
}
}
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
public static void PrintValue(SPFieldLookupValue value)
{
Console.WriteLine("Lookup item ID: {0}", value.LookupId);
Console.WriteLine("Lookup item value: {0}", value.LookupValue);
}
}
}
Imports System
Imports Microsoft.SharePoint
Module ConsoleApp
Sub Main(ByVal args As String())
Using site As New SPSite("https://localhost")
Using web As SPWeb = site.RootWeb
Dim list As SPList = Nothing
For Each webList As SPList In web.Lists
If webList.BaseType = SPBaseType.Issue Then
list = webList
Exit For
End If
Next
If list <> Nothing Then
Dim fieldId As Guid = Guid.Empty
For Each field As SPField In list.Fields
If TypeOf field Is SPFieldLookup Then
fieldId = field.Id
Exit For
End If
Next
If fieldId <> Guid.Empty Then
Dim lookupField As SPFieldLookup = TryCast(list.Fields(fieldId), SPFieldLookup)
Console.WriteLine("Lookup field: {0}", lookupField.Title)
For Each item As SPListItem In list.Items
Dim rawValue As Object = item(fieldId)
If rawValue <> Nothing Then
Console.WriteLine(vbLf & "Item: {0}. {1}", item.ID, item.Title)
Console.WriteLine("Raw value: {0}", rawValue)
If lookupField.AllowMultipleValues Then
Dim values As SPFieldLookupValueCollection = TryCast(item(fieldId), _
SPFieldLookupValueCollection)
For Each value As SPFieldLookupValue In values
PrintValue(value)
Next
Else
Dim value As New SPFieldLookupValue(rawValue.ToString())
PrintValue(value)
End If
End If
Next
End If
End If
End Using
End Using
Console.Write(vbLf & "Press ENTER to continue...")
Console.ReadLine()
End Sub
Sub PrintValue(ByVal value As SPFieldLookupValue)
Console.WriteLine("Lookup item ID: {0}", value.LookupId)
Console.WriteLine("Lookup item value: {0}", value.LookupValue)
End Sub
End Module
线程安全性
该类型的任何公共 静态 (已共享 在 Visual Basic 中) 成员都是线程安全的。不保证任何实例成员都是线程安全的。