苔藓: 功能示例 — — 自定义数据类型

业务方案:

企业范围内执行的青苔的制造业公司 30+ 站点和几个几十个企业部门.

业务目标:

尽管大量的业务组 (部门, 地点, 等), 某些数据应维持在全球一级. 例如, 本公司的所有物理位置具有权威性的主列表 (例如:. 生产设施, 仓库地点, 销售办事处) 应维持在一个中央位置.

技术上的问题:

企业分类是使用多个站点集合来实现. 我们本来希望在 WSS 的自定义列表中创建的物理位置的权威列表. 然后, 当我们需要一个内容类型中有一列 (或一列添加到列表或文档库) 包含公司位置, 我们将创建使用"查找列" 数据类型和指向此主列表.

不幸的是, 查找数据类型必须访问"本地源列表" 我们具有权威性的列表不能跨站点集合的含义.

技术解决方案:

实施新的自定义数据类型执行基于的 SPField 和代表作为在 UI 中的列表项目从主 WSS 列表填充下拉列表.

我们创建了一个名为的新网站集合 "http://localhost/EnterpriseData". 有, 我们创建了名为"企业位置"的自定义列表. 此列表只是用一个标准的"标题" 字段包含列表的实际公司位置.

一个跟着几个离散的步骤在 WSS 中创建一个自定义数据类型. 他们是:

  1. 定义一个类的继承自 SPField (如果需要一个可从其他字段继承).

这里是的代码,:

公众 XYZZYCorporateLocationField : SPFieldText
{
公众 XYZZYCorporateLocationField
(SPFieldCollection 字段, 字符串 typeName, 字符串 显示名称)
: 基地(字段, typeName, 显示名称) { }

公众 XYZZYCorporateLocationField
(SPFieldCollection 字段, 字符串 显示名称)
: 基地(字段, 显示名称) { }

公众 重写 BaseFieldControl FieldRenderingControl
{
获取
{
BaseFieldControl 控制 = 新增功能 XYZZYCorporateLocationFieldControl();
控制。FieldName = .InternalName;
返回 控制;
} //获取
} // fieldrenderingcontrol

公众 重写 字符串 GetValidatedString(对象 价值)
{
如果 (.必填 || 值。ToString().等于(字符串.空))
{
抛出 新增功能 SPFieldValidationException ("未分配部门。");
}
返回 基地.GetValidatedString(价值);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. 定义另一个类,从基本字段控件继承, 如在:

公众 XYZZYCorporateLocationFieldControl : BaseFieldControl
{
受保护 DropDownList XYZZYCorporateLocationSelector;

受保护 重写 字符串 DefaultTemplateName
{
获取
{
返回 "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

公众 重写 对象 价值
{
获取
{
EnsureChildControls();
返回 .SelectedValue XYZZYCorporateLocationSelector。;
} // 获取
设置
{
EnsureChildControls();
.XYZZYCorporateLocationSelector.SelectedValue = (字符串).ItemFieldValue;
} // 设置
} // 重写对象值

受保护 重写 无效 CreateChildControls()
{

如果 (.字段 = = 则为 null || .ControlMode = = SPControlMode.显示)
返回;

基地.CreateChildControls();

.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer。("XYZZYCorporateLocationSelector");

如果 (.XYZZYCorporateLocationSelector = = 则为 null)
抛出 新增功能 异常("错误: 无法加载。ASCX 文件!");

如果 (!.IsPostBack 页。)
{

使用 (SPSite 网站 = 新增功能 SPSite("http://本地主机/enterprisedata"))
{
使用 (SPWeb web = 网站。OpenWeb())
{

写入 currentList = web。列表["企业位置"];

foreach (SPItem XYZZYCorporateLocation 在中 currentList.Items)
{
如果 (XYZZYCorporateLocation["标题"] == 则为 null) «««;

字符串 标题;
标题 = XYZZYCorporateLocation["标题"].ToString();

.XYZZYCorporateLocationSelector.Items.Add
(新增功能 ListItem(标题, 标题));

} // foreach

} // 使用 spweb web = site.openweb()
} // 使用 spsite 网站 = 新 spsite("http://本地主机/enterprisedata")

} // 如果不是回发

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

上面的代码基本上实现用于填充下拉列表中位于 WSS 自定义列表中的值与逻辑 http://localhost/enterprisedata 和命名"公司部门".

我在单个.cs 文件中定义这两个类, 编译它并把它放入 gac 中 (强烈要求, 答案是肯定的).

  1. 实现控件模板 (.ascx) 如图所示:

<%@ 控制 语言="C#" 继承="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,版本 = 12.0.0.0,文化 = 中性,Publickeytoken) = 71e9bce111e9429c" compilationMode="总" %>
<%
@ 登记册 Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" 大会="Microsoft.SharePoint, 版本 = 12.0.0.0, 文化 = 中性, Publickeytoken) = 71e9bce111e9429c" %> <%@ 登记册 Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 大会="Microsoft.SharePoint, 版本 = 12.0.0.0, 文化 = 中性, Publickeytoken) = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="服务器">
<模板>
<asp:DropDownList ID="XYZZYCorporateLocationSelector" runat="服务器" />
</模板>
</
SharePoint:RenderingTemplate>

以上所述被保存到 c:\程序必须使用 sharedweb 服务器 extensions12controltemplates.

  1. 最后, 我们创建一个 XML 文件将保存到...12XML 目录. 这是定义我们的自定义数据类型的加枫和我的例子, 看起来像这样:

<?xml 版本="1.0" 编码="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
字段 名称="TypeName">CorporateLocations</字段>
<
字段 名称="ParentType">文本</字段>
<
字段 名称="TypeDisplayName">公司位置</字段>
<
字段 名称="TypeShortDescription">所有 XYZZY 公司的地点,包括制造或其他设施.</字段>
<
字段 名称="UserCreatable">TRUE</字段>
<
字段 名称="ShowInListCreate">TRUE</字段>
<
字段 名称="ShowInDocumentLibraryCreate">TRUE</字段>
<
字段 名称="ShowInSurveyCreate">TRUE</字段>
<
字段 名称="ShowInColumnTemplateCreate">TRUE</字段>
<
字段 名称="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, 版本 = 1.0.0.0, 文化 = 中性, 应用 = b0b19e85410990c4</字段>
<
RenderPattern 名称="DisplayPattern">
<
开关>
<
Expr>
<
/>
</
Expr>

<案例 价值=""/>

<默认>
<
HTML>
<![CDATA[
<大跨度风格 ="颜色:红色"><b>]]>
</
HTML>

<
SubColumnNumber="0" HTMLEncode="TRUE"/>

<HTML><![CDATA[</b></大跨度>]]></HTML>

</
默认>
</
开关>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
此 XML 文件将自定义数据类型添加到"库 WSS" 和与它匹配和 gac 中了大会.

所有这些位移动到位后, 服务器和它上的 iisreset 应很好地工作的所有开始.

3 上“的想法苔藓: 功能示例 — — 自定义数据类型

  1. 亚历杭德罗
    嗨保罗,
    首先, 感谢的文章, 因为它是非常有趣. 只有一个问题;
    你知道它是否走向才能正确呈现列表中的数据表视图中的自定义字段类型?
    因为每个自定义字段类型创建它在数据表视图中显示为只读 (和 MSDN, 例如, 不能帮我很大 :-S).
    谢谢
    答复
  2. Lyndsay

    我试图执行您的解决方案. 然而我而不是下拉列表, 我只有 DropDownChoiceList 的选项. 你碰巧知道如何将项目添加到 DropDownChoiceList 吗? 我们在使用 SharePoint 2007 SP1 和 Visual Studio 2005 PPR.

    答复

留言

您的电子邮件地址不会被公开. 必需的地方已做标记 *