מוס: דוגמה פונקציונלית – סוג נתונים מותאמים אישית

תרחישים עסקיים:

יישום כלל-ארגוני של מוס עבור ייצור החברה עם 30+ אתרים, כמה עשרות מחלקות החברה.

המטרה העסקית:

למרות מספר רב של קבוצות עסקיות (מחלקות, מיקומים, ועוד), נתונים מסוימים צריך להיות מתוחזק ברמה העולמית. לדוגמה, רשימת המאסטר הסמכותי של כל המיקומים הפיזיים של החברה (המסופקים. מתקני ייצור, מחסן מיקומים, משרדי מכירות) צריך להישמר במיקום מרכזי.

בעיה טכנית:

הטקסונומיה של הארגון בוצעה באמצעות אוספי אתרים מרובים. שרצינו ליצור רשימת מיקומים פיזיים סמכותי רשימה מותאמת אישית של WSS. לאחר מכן, כאשר היינו צריכים עמודה של סוג תוכן (או עמודה להוסיף ספרייה לרשימה או דוק) זה הכיל מיקומים של החברה, אנו ניצור עמודה באמצעות בדיקת מידע"" סוג נתונים ונקודת ברשימה הראשית.

למרבה הצער, נתונים מסוג בדיקת מידע עליך לגשת לרשימה מקור מקומי"" משמעות כי רשימת המוסמכים שלנו לא יכול להתפרס אוספי אתרים.

פתרון טכני:

יישום סוג נתונים מותאם אישית חדש מיושם על בסיס SPField, כמייצג DropDownList בממשק המשתמש של מי ListItems אכלס מתוך הרשימה הראשית של WSS.

יצרנו אוסף אתרים חדש שנקרא "http://localhost/EnterpriseData". שם, יצרנו רשימה מותאמת אישית בשם "מיקומים של החברה". רשימה זו משתמשת רק הכותרת"סטנדרטי" כדי להכיל את רשימת מיקומים של החברה בפועל.

האחד נובע מספר שלבים נפרדים כדי ליצור סוג נתונים מותאמים אישית ב- WSS. הם:

  1. הגדרת מחלקה אשר יורש SPField (אחד עשוי לרשת מתחומים אחרים במידת הצורך).

. הנה הקוד בשביל זה:

הציבור מחלקה XYZZYCorporateLocationField : SPFieldText
{
הציבור XYZZYCorporateLocationField
(SPFieldCollection שדות, מחרוזת typeName, מחרוזת displayName)
: בסיס(שדות, typeName, displayName) { }

הציבור XYZZYCorporateLocationField
(SPFieldCollection שדות, מחרוזת displayName)
: בסיס(שדות, displayName) { }

הציבור עקיפה 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;
} // סט
} // לעקוף את האובייקט ערך

מוגן עקיפה void CreateChildControls()
{

אם (זה.שדה = = null || זה.ControlMode = = SPControlMode.התצוגה)
החזרה;

בסיס.CreateChildControls();

זה.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.("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
(חדש פריט(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 מזהה= "XYZZYCorporateLocationFieldControl" runat= "שרת">
<תבנית>
<asp:DropDownList מזהה= "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[
<span סגנון = "צבע:אדום"><b>]]>
</
HTML>

<
טור SubColumnNumber="0" HTMLEncode="נכון"/>

<HTML><![CDATA[</b></טווח>]]></HTML>

</
ברירת מחדל>
</
מתג>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
קובץ XML זה מוסיף את סוג נתונים מותאמים אישית הקובץ WSS "ספריית" ומתאימה אותו מול GAC היה הרכבה.

לאחר כל סיביות אלה מתמקמים, iisreset על השרת והוא צריך להתחיל כל עובד יפה.

3 מחשבות על "מוס: דוגמה פונקציונלית – סוג נתונים מותאמים אישית

  1. אלחנדרו
    פול הי,
    קודם כל, תודה על המאמר, כי זה מאוד מעניין. רק שאלה אחת;
    את יודעת אם זה posible לעיבוד כראוי סוג שדה מותאם אישית בתצוגת גליון נתונים של רשימה?
    כי כל סוג שדה מותאם אישית ליצור זה מוצג לקריאה בלבד בתצוגת גליון נתונים (ו- MSDN, לדוגמה, לא עוזר לי מאוד :-S).
    תודה
  2. Lyndsay

    אני מנסה ליישם את הפתרון שלך. עם זאת אני במקום DropDownList, . יש לי רק את האפשרות עבור DropDownChoiceList. יש לך במקרה לדעת כיצד להוסיף פריטים DropDownChoiceList? אנו משתמשים SharePoint 2007 SP1 ו- Visual Studio 2005 SP1.

תשאיר הודעה

כתובת האימייל שלך לא תפורסם. שדות חובה מסומנים *