RÊU: Ví dụ chức năng-kiểu tùy chỉnh dữ liệu

Kinh doanh kịch bản:

Toàn doanh nghiệp thực hiện rêu cho công ty sản xuất với 30+ Các trang web và một vài bộ phận chục doanh nghiệp.

Mục tiêu kinh doanh:

Mặc dù một vô số các nhóm kinh doanh (bộ phận, địa điểm, vv), một số dữ liệu nên được duy trì ở mức toàn cầu. Ví dụ:, một danh sách tổng thể uỷ quyền của tất cả các vị trí thực tế của công ty (Ví dụ như. cơ sở sản xuất, vị trí kho, văn phòng bán hàng) nên được duy trì ở một vị trí trung tâm.

Vấn đề kỹ thuật:

Phân loại doanh nghiệp được thực hiện bằng cách sử dụng nhiều trang web bộ sưu tập. Chúng tôi đã có thể thích để tạo danh sách thẩm quyền của vị trí thực tế trong một danh sách WSS tùy chỉnh. Sau đó, Khi chúng tôi cần thiết để có một cột trong một loại nội dung (hoặc một cột mới nhất được gửi vào một danh sách hoặc tài liệu thư viện) mà có công ty địa điểm, chúng tôi sẽ tạo ra một cột bằng cách sử dụng "tra cứu" loại dữ liệu và điểm vào danh sách tổng thể này.

Thật không may, tra cứu datatypes phải truy cập vào một danh sách nguồn "tại địa phương" ý nghĩa của chúng tôi danh sách thẩm quyền không thể khoảng các bộ sưu tập trang web.

Giải pháp kỹ thuật:

Thực hiện một kiểu dữ liệu tuỳ chỉnh mới thực hiện dựa trên SPField và thể hiện như một DropDownList trong giao diện người dùng có ListItems cư töø danh saùch WSS tổng thể.

Chúng tôi tạo ra một bộ sưu tập trang web mới được gọi là "http://localhost/EnterpriseData". Có, chúng tôi tạo ra một danh sách tùy chỉnh tên "Vị trí doanh nghiệp". Danh sách này chỉ sử dụng tiêu chuẩn "tiêu đề" lĩnh vực này để chứa danh sách các địa điểm thực tế của công ty.

Một sau một vài bước rời rạc để tạo ra một loại tùy chỉnh dữ liệu trong WSS. Bọn chúng:

  1. Xác định một lớp đó thừa hưởng từ SPField (một có thể thừa kế từ các lĩnh vực khác nếu cần thiết).

Đây là mã cho rằng:

công cộng lớp học XYZZYCorporateLocationField : SPFieldText
{
công cộng XYZZYCorporateLocationField
(SPFieldCollection lĩnh vực, chuỗi typeName, chuỗi displayName)
: cơ sở(lĩnh vực, typeName, displayName) { }

công cộng XYZZYCorporateLocationField
(SPFieldCollection lĩnh vực, chuỗi displayName)
: cơ sở(lĩnh vực, displayName) { }

công cộng ghi đè BaseFieldControl FieldRenderingControl
{
nhận được
{
BaseFieldControl kiểm soát = mới XYZZYCorporateLocationFieldControl();
kiểm soát. FieldName = Điều này.InternalName;
trở lại kiểm soát;
} //nhận được
} // fieldrenderingcontrol

công cộng ghi đè chuỗi GetValidatedString(đối tượng giá trị)
{
Nếu (Điều này.Yêu cầu || giá trị. ToString().Bằng(Chuỗi.Sản phẩm nào))
{
ném mới SPFieldValidationException ("Không phân vùng.");
}
trở lại cơ sở.GetValidatedString(giá trị);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Xác định một lớp thừa hưởng từ sự kiểm soát cơ sở trường, như trong:

công cộng lớp học XYZZYCorporateLocationFieldControl : BaseFieldControl
{
bảo vệ DropDownList XYZZYCorporateLocationSelector;

bảo vệ ghi đè chuỗi DefaultTemplateName
{
nhận được
{
trở lại "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

công cộng ghi đè đối tượng Giá trị
{
nhận được
{
EnsureChildControls();
trở lại Điều này.XYZZYCorporateLocationSelector.SelectedValue;
} // nhận được
thiết lập
{
EnsureChildControls();
Điều này.XYZZYCorporateLocationSelector.SelectedValue = (chuỗi)Điều này.ItemFieldValue;
} // thiết lập
} // ghi đè lên các đối tượng giá trị

bảo vệ ghi đè void CreateChildControls()
{

Nếu (Điều này.Lĩnh vực == null || Điều này.ControlMode == SPControlMode.Hiển thị)
trở lại;

cơ sở.CreateChildControls();

Điều này.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer. FindControl("XYZZYCorporateLocationSelector");

Nếu (Điều này.XYZZYCorporateLocationSelector == null)
ném mới Ngoại lệ("LỖI: Không thể nạp. ASCX tập tin!");

Nếu (!Điều này.IsPostBack trang.)
{

bằng cách sử dụng (SPSite Trang web = mới SPSite("http://localhost/enterprisedata"))
{
bằng cách sử dụng (SPWeb web = trang web. OpenWeb())
{

Splist.Update() currentList = trang web. Danh sách["Công ty địa điểm"];

foreach (SPItem XYZZYCorporateLocation currentList.Items)
{
Nếu (XYZZYCorporateLocation["Tiêu đề"] == null) «««;

chuỗi theTitle;
theTitle = XYZZYCorporateLocation["Tiêu đề"].ToString();

Điều này.XYZZYCorporateLocationSelector.Items.Add
(mới ListItem(theTitle, theTitle));

} // foreach

} // bằng cách sử dụng spweb web = site.openweb()
} // bằng cách sử dụng trang web spsite = mới spsite("http://localhost/enterprisedata")

} // Nếu không một postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Đoạn mã trên về cơ bản thực hiện logic cho populating DropDownList với các giá trị từ danh sách tùy chỉnh WSS nằm ở http://localhost/enterprisedata và tên là "công ty tỉnh".

Tôi xác định cả hai lớp trong một file duy nhất .cs, biên dịch nó và đặt nó vào gấc (mạnh mẽ yêu cầu, Tất nhiên).

  1. Thực hiện một mẫu kiểm soát (.ascx) như được hiển thị:

<%@ Kiểm soát Ngôn ngữ= "C#" Kế thừa="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Phiên bản = 12.0.0.0, văn hóa = trung lập,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Luôn luôn" %>
<%
@ Đăng ký Tagprefix= "wssawc" Không gian tên="Microsoft.SharePoint.WebControls" Lắp ráp="Microsoft.SharePoint, Phiên bản = 12.0.0.0, Văn hóa = trung tính, PublicKeyToken = 71e9bce111e9429c" %> <%@ Đăng ký Tagprefix= "SharePoint" Không gian tên="Microsoft.SharePoint.WebControls" Lắp ráp="Microsoft.SharePoint, Phiên bản = 12.0.0.0, Văn hóa = trung tính, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "máy chủ">
<Tiêu bản>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "máy chủ" />
</Tiêu bản>
</
SharePoint:RenderingTemplate>

Ở trên được lưu vào c:\chương trình filesmicrosoft filescommon sharedweb máy chủ extensions12controltemplates.

  1. Cuối cùng, chúng tôi tạo ra một tập tin XML để lưu vào các... 12XML thư mục. Đây là CAML xác định kiểu dữ liệu tùy chỉnh của chúng tôi và ví dụ của tôi, trông như thế này:

<?XML Phiên bản="1.0" mã hóa="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Lĩnh vực Tên="TypeName">CorporateLocations</Lĩnh vực>
<
Lĩnh vực Tên="ParentType">Văn bản</Lĩnh vực>
<
Lĩnh vực Tên="TypeDisplayName">Công ty địa điểm</Lĩnh vực>
<
Lĩnh vực Tên="TypeShortDescription">Tất cả các địa điểm XYZZY công ty bao gồm sản xuất hoặc các hóa chất.</Lĩnh vực>
<
Lĩnh vực Tên="UserCreatable">ĐÚNG</Lĩnh vực>
<
Lĩnh vực Tên="ShowInListCreate">ĐÚNG</Lĩnh vực>
<
Lĩnh vực Tên="ShowInDocumentLibraryCreate">ĐÚNG</Lĩnh vực>
<
Lĩnh vực Tên="ShowInSurveyCreate">ĐÚNG</Lĩnh vực>
<
Lĩnh vực Tên="ShowInColumnTemplateCreate">ĐÚNG</Lĩnh vực>
<
Lĩnh vực Tên="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Phiên bản = 1.0.0.0, Văn hóa = trung tính, PublicKeyToken = b0b19e85410990c4</Lĩnh vực>
<
RenderPattern Tên="DisplayPattern">
<
Chuyển đổi>
<
Expr>
<
Cột />
</
Expr>

<Trường hợp Giá trị=""/>

<Mặc định>
<
HTML>
<![CDATA[
<khoảng phong cách = "màu:Đỏ"><b>]]>
</
HTML>

<
Cột SubColumnNumber="0" HTMLEncode="ĐÚNG"/>

<HTML><![CDATA[</b></khoảng>]]></HTML>

</
Mặc định>
</
Chuyển đổi>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Tệp tin XML này cho biết thêm kiểu dữ liệu tuỳ chỉnh để WSS "thư viện" và phù hợp với nó lên chống lại gấc đã lắp ráp.

Sau khi di chuyển tất cả các bit vào vị trí, iisreset trên máy chủ và nó nên tất cả bắt đầu làm việc độc đáo.

3 Những suy nghĩ trên "RÊU: Ví dụ chức năng-kiểu tùy chỉnh dữ liệu

  1. Alejandro
    Hi Paul,
    Trước tiên, cảm ơn bài viết, bởi vì nó là rất thú vị. Chỉ có một câu hỏi;
    Bạn có biết nếu nó là posible để hiển thị một cách chính xác một loại lĩnh vực tùy chỉnh trong giao thông số kỹ thuật của một danh sách?
    Bởi vì tất cả các loại lĩnh vực tùy chỉnh tôi tạo ra nó sẽ được hiển thị chỉ đọc trong chế độ xem thông số kỹ thuật (và MSDN, Ví dụ, không giúp tôi rất nhiều :-S).
    Cảm ơn
  2. Lyndsay

    Tôi đang cố gắng thực hiện giải pháp của bạn. Tuy nhiên tôi thay vì DropDownList, Tôi chỉ có tùy chọn cho một DropDownChoiceList. Bạn có xảy ra để biết làm thế nào để thêm khoản mục vào một DropDownChoiceList? Chúng tôi đang sử dụng SharePoint 2007 SP1 và Visual Studio 2005 SP1.

Để lại câu trả lời

Địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *