มอส: ตัวอย่างหน้าที่ – ชนิดข้อมูลที่กำหนดเอง

สถานการณ์ของธุรกิจ:

งานทั่วทั้งองค์กรของมอสสำหรับบริษัทผู้ผลิตด้วย 30+ ไซต์และแผนกของบริษัทกี่โหล.

วัตถุประสงค์ทางธุรกิจ:

แม้ มีความหลากหลายของกลุ่มธุรกิจ (แผนก, สถานที่เก็บ, ฯลฯ), ควรเก็บข้อมูลในระดับสากล. ตัวอย่าง, รายการหลักเชื่อถือของตำแหน่งทางกายภาพทั้งหมดของบริษัท (เช่น. ผลิตสิ่งอำนวยความสะดวก, ที่ตั้งคลังสินค้า, สำนักงานขาย) ควรเก็บในสถานที่กลาง.

ปัญหาทางเทคนิค:

ระบบองค์กรที่ดำเนินการโดยใช้หลายเว็บไซต์. เราจะชอบสร้างรายการไทม์ที่ตั้งทางกายภาพใน WSS รายการกำหนดเอง. แล้ว, เมื่อเราต้องมีคอลัมน์ในชนิดเนื้อหา (หรือเพิ่มคอลัมน์ในไลบรารีเอกสารหรือรายการ) ที่อยู่ที่ตั้งบริษัท, เราจะสร้างคอลัมน์โดยใช้การค้นหา"" ชนิดข้อมูลและชี้ไปยังรายการหลัก.

แต่น่าเสียดาย, ชนิดข้อมูลการค้นหาต้องเข้าถึงแหล่งที่มารายการ "ท้อง" หมายความ ว่า รายการของเราเชื่อถือไม่สามารถขยายไซต์คอลเลกชัน.

ด้านเทคนิค:

ใช้ชนิดข้อมูลที่กำหนดเองใหม่ดำเนินการตาม SPField และแสดงเป็น DropDownList ใน UI ListItems สร้างจากรายการ WSS หลัก.

เราได้สร้างชุดของไซต์ใหม่เรียกว่า "http://localhost/EnterpriseData". มี, เราสร้างรายการแบบกำหนดเองที่ชื่อ "ที่ตั้งขององค์กร". รายการนี้ใช้เพียงชื่อมาตรฐาน "เรื่อง" ฟิลด์จะประกอบด้วยรายการของที่ตั้งของบริษัทจริง.

หนึ่งดังต่อไปนี้ไม่ต่อเนื่องหลายขั้นตอนเพื่อสร้างชนิดข้อมูลที่กำหนดเองใน WSS. พวกเขาจะ:

  1. กำหนดคลาสซึ่งสืบทอดมาจาก SPField (หนึ่งอาจมาจากฟิลด์อื่น ๆ ถ้าจำเป็น).

นี่คือรหัสที่:

สาธารณะ คลาส XYZZYCorporateLocationField : SPFieldText
{
สาธารณะ XYZZYCorporateLocationField
(SPFieldCollection เขตข้อมูล, สายอักขระ typeName, สายอักขระ displayName)
: ฐาน(เขตข้อมูล, typeName, displayName) { }

สาธารณะ XYZZYCorporateLocationField
(SPFieldCollection เขตข้อมูล, สายอักขระ displayName)
: ฐาน(เขตข้อมูล, displayName) { }

สาธารณะ การแทน BaseFieldControl FieldRenderingControl
{
รับ
{
BaseFieldControl การควบคุม = ใหม่ XYZZYCorporateLocationFieldControl();
ควบคุม ชื่อเขตข้อมูล = นี้.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://localhost/enterprisedata"))
{
โดยใช้ (SPWeb เว็บไซต์ = OpenWeb())
{

Splist.update() currentList =เว็บ รายการ["ตำแหน่งขององค์กร"];

foreach (SPItem XYZZYCorporateLocation ใน currentList.Items)
{
ถ้า (XYZZYCorporateLocation[ชื่อเรื่อง""] == null) « « «;

สายอักขระ theTitle;
theTitle = XYZZYCorporateLocation[ชื่อเรื่อง""].ToString();

นี้.XYZZYCorporateLocationSelector.Items.Add
(ใหม่ ListItem(theTitle, theTitle));

} // foreach

} // ใช้เว็บ spweb = site.openweb()
} // ใช้ spsite ไซต์ = spsite ใหม่("http://localhost/enterprisedata")

} // ถ้า ไม่มีการ postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

รหัสข้างต้นใช้ตรรกะสำหรับกำลังเติมข้อมูล DropDownList มีค่าจากรายการแบบกำหนดเอง 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:\โปรแกรม filescommon filesmicrosoft sharedweb เซิร์ฟเวอร์ extensions12controltemplates.

  1. ขั้นตอนสุดท้าย, เราสร้างแฟ้ม XML ที่จะบันทึกลงใน... 12XML ไดเรกทอรี. นี่คือ CAML ที่กำหนดชนิดของข้อมูลที่กำหนดเองและตัวของฉัน, ลักษณะเช่นนี้:

<?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, วัฒนธรรม =เป็นกลาง, PublicKeyToken = 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. Alejandro
    Hi Paul,
    ก่อนอื่น, ขอบคุณสำหรับบทความ, เนื่องจากมีความน่าสนใจมาก. คำถามเดียวเท่านั้น;
    คุณรู้หรือไม่ถ้าเป็น posible แสดงชนิดเขตข้อมูลกำหนดเองในมุมมองแผ่นข้อมูลของรายการได้อย่างถูกต้องหรือไม่?
    เพราะทุกชนิดเขตข้อมูลกำหนดเองที่ฉันสร้างจะแสดงเป็นแบบอ่านอย่างเดียวในมุมมองแผ่นข้อมูล (และ MSDN, ตัวอย่างเช่น, ไม่ช่วยฉันมาก :-S).
    ขอขอบคุณ
  2. Lyndsay

    ฉันพยายามใช้โซลูชันของคุณ. อย่างไรก็ตามฉันแทน DropDownList, มีตัวเลือกสำหรับการ DropDownChoiceList เท่านั้น. คุณบังเอิญรู้วิธีการเพิ่มรายการ DropDownChoiceList? เราใช้ SharePoint 2007 SP1 และ Visual Studio 2005 SP1.

ทิ้งคำตอบไว้

ที่อยู่อีเมลของคุณจะไม่ถูกเผยแพร่. ช่องที่ต้องการถูกทำเครื่องหมาย *