苔蘚: 功能的示例 — — 自訂資料類型

業務應用場景:

製造業公司的 MOSS 企業範圍內實現 30+ 網站和幾個幾十個企業部門.

業務目標:

儘管大量的商業團體 (部門, 位置, 等), 某些資料應保持在全球一級. 舉個例子, 該公司的所有物理位置的權威主清單 (例如:. 生產設施, 倉庫位置, 銷售辦事處) 應保持在一個中心位置.

技術上的問題:

企業分類是使用多個網站集合來實現. 我們本來希望在 WSS 的自訂清單中創建的物理位置的權威清單. 然後, 當我們需要有一列中的內容類型 (或一列添加到清單或文件庫) 包含公司位置, 我們將創建一個使用"查找的列" 資料類型和指向該主清單.

不幸的是, 查找的資料類型必須訪問"本地的源清單" 我們的權威清單不能跨網站集合的含義.

技術解決方案:

實施新的自訂資料類型執行基於的 SPField,表示為其清單專案填充從主 WSS 清單中的使用者介面中的 DropDownList.

我們創建了一個新的網站集合,稱為 "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();
返回 .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 中 (強烈要求, 答案是肯定的).

  1. 實施一個控制項範本 (.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.

  1. 最後, 我們創建一個 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 應該很好地工作的所有開始.

3 上“的想法苔蘚: 功能的示例 — — 自訂資料類型

  1. 亞曆杭德羅
    嗨保羅,
    首先, 感謝您的文章, 因為它很有趣. 只有一個問題;
    你知道它是否正確地呈現在清單中的資料表視圖中自訂欄位的類型,可進行?
    因為每個自訂欄位類型創建它在資料表視圖中顯示為唯讀 (和 MSDN, 舉個例子, 不能幫我很多 :-S).
    謝謝
    答覆
  2. Lyndsay

    我試圖執行您的解決方案. 然而我而不是下拉清單, 我只有 DropDownChoiceList 的選項. 你碰巧知道如何將專案添加到 DropDownChoiceList 嗎? 我們正在使用 SharePoint 2007 SP1 和 Visual Studio 2005 SP1.

    答覆

留言

您的電子郵件地址不會被公開. 必需的地方已做標記 *