业务方案:
企业范围内执行的青苔的制造业公司 30+ 站点和几个几十个企业部门.
业务目标:
尽管大量的业务组 (部门, 地点, 等), 某些数据应维持在全球一级. 例如, 本公司的所有物理位置具有权威性的主列表 (例如:. 生产设施, 仓库地点, 销售办事处) 应维持在一个中央位置.
技术上的问题:
企业分类是使用多个站点集合来实现. 我们本来希望在 WSS 的自定义列表中创建的物理位置的权威列表. 然后, 当我们需要一个内容类型中有一列 (或一列添加到列表或文档库) 包含公司位置, 我们将创建使用"查找列" 数据类型和指向此主列表.
不幸的是, 查找数据类型必须访问"本地源列表" 我们具有权威性的列表不能跨站点集合的含义.
技术解决方案:
实施新的自定义数据类型执行基于的 SPField 和代表作为在 UI 中的列表项目从主 WSS 列表填充下拉列表.
我们创建了一个名为的新网站集合 "http://localhost/EnterpriseData". 有, 我们创建了名为"企业位置"的自定义列表. 此列表只是用一个标准的"标题" 字段包含列表的实际公司位置.
一个跟着几个离散的步骤在 WSS 中创建一个自定义数据类型. 他们是:
- 定义一个类的继承自 SPField (如果需要一个可从其他字段继承).
这里是的代码,:
公众 类 XYZZYCorporateLocationField : SPFieldText
{
公众 XYZZYCorporateLocationField
(SPFieldCollection 字段, 字符串 typeName, 字符串 显示名称)
: 基地(字段, typeName, 显示名称) { }
公众 XYZZYCorporateLocationField
(SPFieldCollection 字段, 字符串 显示名称)
: 基地(字段, 显示名称) { }
公众 重写 BaseFieldControl FieldRenderingControl
{
获取
{
BaseFieldControl 控制 = 新增功能 XYZZYCorporateLocationFieldControl();
控制。FieldName = 这.InternalName;
返回 控制;
} //获取
} // fieldrenderingcontrol
公众 重写 字符串 GetValidatedString(对象 价值)
{
如果 (这.必填 || 值。ToString().等于(字符串.空))
{
抛出 新增功能 SPFieldValidationException ("未分配部门。");
}
返回 基地.GetValidatedString(价值);
} // getvalidatedstring
} // XYZZYCorporateLocation
- 定义另一个类,从基本字段控件继承, 如在:
公众 类 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 中 (强烈要求, 答案是肯定的).
-
实现控件模板 (.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.
- 最后, 我们创建一个 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 应很好地工作的所有开始.
使用 System.Web.UI;
使用 System.Web.UI.WebControls;
我试图执行您的解决方案. 然而我而不是下拉列表, 我只有 DropDownChoiceList 的选项. 你碰巧知道如何将项目添加到 DropDownChoiceList 吗? 我们在使用 SharePoint 2007 SP1 和 Visual Studio 2005 PPR.