業務應用場景:
製造業公司的 MOSS 企業範圍內實現 30+ 網站和幾個幾十個企業部門.
業務目標:
儘管大量的商業團體 (部門, 位置, 等), 某些資料應保持在全球一級. 舉個例子, 該公司的所有物理位置的權威主清單 (例如:. 生產設施, 倉庫位置, 銷售辦事處) 應保持在一個中心位置.
技術上的問題:
企業分類是使用多個網站集合來實現. 我們本來希望在 WSS 的自訂清單中創建的物理位置的權威清單. 然後, 當我們需要有一列中的內容類型 (或一列添加到清單或文件庫) 包含公司位置, 我們將創建一個使用"查找的列" 資料類型和指向該主清單.
不幸的是, 查找的資料類型必須訪問"本地的源清單" 我們的權威清單不能跨網站集合的含義.
技術解決方案:
實施新的自訂資料類型執行基於的 SPField,表示為其清單專案填充從主 WSS 清單中的使用者介面中的 DropDownList.
我們創建了一個新的網站集合,稱為 "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();
返回 這.XYZZYCorporateLocationSelector SelectedValue。;
} // 獲取
設置
{
EnsureChildControls();
這.XYZZYCorporateLocationSelector.SelectedValue = (字串)這.ItemFieldValue;
} // 設置
} // 重寫物件值
受保護 重寫 無效 CreateChildControls()
{
如果 (這.欄位 = = 則為 null || 這.ControlMode = = SPControlMode.顯示)
返回;
基地.CreateChildControls();
這.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer FindControl。("XYZZYCorporateLocationSelector");
如果 (這.XYZZYCorporateLocationSelector = = 則為 null)
拋出 新增功能 異常("錯誤: 無法載入。ASCX 檔!");
如果 (!這.IsPostBack 頁。)
{
使用 (SPSite 網站 = 新增功能 SPSite("HTTP://本地主機/enterprisedata"))
{
使用 (SPWeb web = 網站。OpenWeb())
{
SPList 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,文化 = 中性,公開金鑰 = 71e9bce111e9429c" compilationMode"總是 =" %>
<%@ 登記冊 Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" 程式集="Microsoft.SharePoint, 版本 = 12.0.0.0, 文化 = 中性, 公開金鑰 = 71e9bce111e9429c" %> <%@ 登記冊 Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 程式集="Microsoft.SharePoint, 版本 = 12.0.0.0, 文化 = 中性, 公開金鑰 = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="伺服器">
<範本>
<asp:DropDownList ID="XYZZYCorporateLocationSelector" runat="伺服器" />
</範本>
</SharePoint:RenderingTemplate>
以上被保存到 c:\程式 filescommon filesmicrosoft sharedweb 伺服器 extensions12controltemplates.
- 最後, 我們創建一個 XML 檔將保存到 ... ... 12XML 目錄. 這是定義我們的自訂資料類型的加楓和我的例子, 看起來像這樣:
<?xml 版本="1.0" 編碼="utf-8" ?>
<FieldTypes>
<FieldType>
<欄位 名稱="TypeName">CorporateLocations</欄位>
<欄位 名稱="ParentType">文本</欄位>
<欄位 名稱="TypeDisplayName">公司位置</欄位>
<欄位 名稱="TypeShortDescription">所有 XYZZY 公司的地點,包括製造或其他設施.</欄位>
<欄位 名稱="UserCreatable">真實</欄位>
<欄位 名稱="ShowInListCreate">真實</欄位>
<欄位 名稱="ShowInDocumentLibraryCreate">真實</欄位>
<欄位 名稱="ShowInSurveyCreate">真實</欄位>
<欄位 名稱="ShowInColumnTemplateCreate">真實</欄位>
<欄位 名稱="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, 版本 = 1.0.0.0, 文化 = 中性, 應用 = b0b19e85410990c4</欄位>
<RenderPattern 名稱="DisplayPattern">
<交換器>
<Expr>
<列 />
</Expr>
<案例 價值=""/>
<預設值>
<HTML>
<![CDATA[<大跨度風格 ="顏色:紅"><b>]]>
</HTML>
<列 SubColumnNumber="0" HTMLEncode="真實"/>
<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 SP1.