Бізнес-сцэнар:
У маштабах усяго прадпрыемства рэалізацыя Мос для вытворчай кампаніі з 30+ сайтаў і некалькі дзясяткаў карпаратыўных аддзелаў.
Бізнес-мэты:
Нягледзячы на мноства бізнес-груп (ведамстваў, месцаў, і г.д.), некаторыя дадзеныя павінны быць захаваны на глабальным узроўні. Напрыклад, майстар аўтарытэтны спіс усіх фізічных офісах кампаніі (e.g. вытворчае абсталяванне, складскіх месцаў, офісаў продажаў) павінна быць захавана ў цэнтры горада.
Тэхнічная праблема:
Прадпрыемства таксанаміі быў рэалізаваны з дапамогай некалькіх сямействаў сайтаў. Нам бы хацелася, каб стварыць аўтарытэтны спіс фізічных месцах у спісе карыстацкіх WSS. Затым, Калі мы павінны былі мець слупок ў тыпе кантэнту (або слупок дадаецца ў спіс або бібліятэку Doc) , Якія ўтрымлівалі карпаратыўных месцах, we would create a column using the "lookup" тыпам дадзеных і паказваць на гэта асноўны спіс.
На жаль, lookup datatypes must access a source list "locally" гэта азначае, што наш аўтарытэтны спіс не можа распаўсюджвацца на сайт калекцый.
Тэхнічнае рашэнне:
Рэалізацыя новага карыстацкага тыпу дадзеных ажыццяўляецца на аснове SPField і прадстаўлены ў выглядзе DropDownList ў карыстацкім інтэрфейсе якога ListItems запаўненне з спісу WSS майстры.
Мы стварылі новы сайт пад назвай калекцыі "http://localhost/EnterpriseData". Там, we created a custom list named "Corporate Locations". This list just uses the standard "Title" поле, якое змяшчае спіс фактычных карпаратыўных месцах.
Адзін наступным некалькіх паслядоўных крокаў, каб стварыць карыстацкі тып дадзеных у WSS. Гэта:
- Вызначце клас, які атрымліваецца ў спадчыну ад SPField (можна успадкаваць ад іншых палёў пры неабходнасці).
Вось код для гэтага:
грамадскасць клас XYZZYCorporateLocationField : SPFieldText
{
грамадскасць XYZZYCorporateLocationField
(SPFieldCollection палёў, радок typeName, радок displayName)
: база(палёў, typeName, displayName) { }
грамадскасць XYZZYCorporateLocationField
(SPFieldCollection палёў, радок displayName)
: база(палёў, displayName) { }
грамадскасць адмяняць BaseFieldControl FieldRenderingControl
{
атрымліваць
{
BaseFieldControl control = новы XYZZYCorporateLocationFieldControl();
control.FieldName = гэта.Ўнутранае імя;
вяртанне control;
} //атрымліваць
} // fieldrenderingcontrol
грамадскасць адмяняць радок GetValidatedString(аб'ект значэнне)
{
калі (гэта.Required || value.ToString().Роўна(Радок.Пусты))
{
кідаць новы SPFieldValidationException ("Department is not assigned.");
}
вяртанне база.GetValidatedString(значэнне);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Вызначыце іншы клас, які атрымлівае ў спадчыну ад кіраўніка поля базы, як у:
грамадскасць клас XYZZYCorporateLocationFieldControl : BaseFieldControl
{
абаронены DropDownList XYZZYCorporateLocationSelector;
абаронены адмяняць радок DefaultTemplateName
{
атрымліваць
{
вяртанне "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
грамадскасць адмяняць аб'ект Значэнне
{
атрымліваць
{
EnsureChildControls();
вяртанне гэта.XYZZYCorporateLocationSelector.SelectedValue;
} // атрымліваць
набор
{
EnsureChildControls();
гэта.XYZZYCorporateLocationSelector.SelectedValue = (радок)гэта.ItemFieldValue;
} // набор
} // override object Value
абаронены адмяняць ануляваць CreateChildControls()
{
калі (гэта.Field == нулявы || гэта.ControlMode == SPControlMode.Адлюстроўваць)
вяртанне;
база.CreateChildControls();
гэта.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");
калі (гэта.XYZZYCorporateLocationSelector == нулявы)
кідаць новы Выключэнне("ERROR: Cannot load .ASCX file!");
калі (!гэта.Page.IsPostBack)
{
выкарыстанне (SPSite site = новы SPSite("http://лакальны / enterprisedata"))
{
выкарыстанне (SPWeb web = site.OpenWeb())
{
SPList currentList = web.Lists["Corporate Locations"];
Еогеасп (Пляваць XYZZYCorporateLocation ў currentList.Items)
{
калі (XYZZYCorporateLocation["Title"] == нулявы) працягваць;
радок theTitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();
гэта.XYZZYCorporateLocationSelector.Items.Add
(новы ListItem(theTitle, theTitle));
} // Еогеасп
} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/enterprisedata")
} // if not a postback
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
Прыведзены вышэй код у асноўным рэалізуе логіку для запаўнення DropDownList значэннямі з карыстацкага спісу WSS размешчаны на http://localhost/enterprisedata and named "Corporate Departments".
Я вызначыў абодвух класаў у адным. Выява CS, скампіляваў яго і паклаў яго ў GAC (моцная неабходных, вядома).
-
Рэалізацыя пра шаблон элемента кіравання (.ASCX) як паказана на малюнку:
<%@ Кіраванне Мова="C#" Спадчыну="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, культура = нейтральнай,PublicKeyToken = 71e9bce111e9429c" CompilationMode="Always" %>
<%@ Рэестр TagPrefix="wssawc" Прастора імёнаў="Microsoft.SharePoint.WebControls" Зборка="Microsoft.SharePoint, Version = 12.0.0.0, Культура = нейтральнай, PublicKeyToken = 71e9bce111e9429c" %> <%@ Рэестр TagPrefix="SharePoint" Прастора імёнаў="Microsoft.SharePoint.WebControls" Зборка="Microsoft.SharePoint, Version = 12.0.0.0, Культура = нейтральнай, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Шаблон візуалізацыі ID="XYZZYCorporateLocationFieldControl" runat="server">
<Шаблон>
<аспід:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Шаблон>
</SharePoint:Шаблон візуалізацыі>
Вышэй захоўваецца ў C:\Program Files Common Files Microsoft Shared пашырэньні вэб-сервера 12 ControlTemplates.
- У рэшце рэшт, мы ствараем XML-файла для захавання ў ..... 12 каталога XML. Гэта CAML, які вызначае нашу карыстацкі тып дадзеных і для майго прыкладу, выглядае наступным чынам:
<?XML версія="1.0" кадаваньне="UTF-8" ?>
<FieldTypes>
<FieldType>
<Поле Імя="TypeName">CorporateLocations</Поле>
<Поле Імя="ParentType">Тэкст</Поле>
<Поле Імя="TypeDisplayName">Corporate Locations</Поле>
<Поле Імя="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Поле>
<Поле Імя="UserCreatable">TRUE,</Поле>
<Поле Імя="ShowInListCreate">TRUE,</Поле>
<Поле Імя="ShowInDocumentLibraryCreate">TRUE,</Поле>
<Поле Імя="ShowInSurveyCreate">TRUE,</Поле>
<Поле Імя="ShowInColumnTemplateCreate">TRUE,</Поле>
<Поле Імя="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Культура = нейтральнай, PublicKeyToken=b0b19e85410990c4</Поле>
<RenderPattern Імя="DisplayPattern">
<Пераключэнне>
<Expr>
<Калонка />
</Expr>
<Выпадак Значэнне=""/>
<Змаўчанне>
<HTML>
<![CDATA[<span style="color:Red"><B>]]>
</HTML>
<Калонка SubcolumnNumber="0" HTMLEncode="TRUE,"/>
<HTML><![CDATA[</B></пралёт>]]></HTML>
</Змаўчанне>
</Пераключэнне>
</RenderPattern>
</FieldType>
</FieldTypes>
This XML file adds the custom data type to the WSS "library" і адпавядае яго супраць GAC'd зборкі.
Пасля пераезду ўсе гэтыя біты на месца, Iisreset на серверы і ўсё павінна пачаць працаваць прыгожа.
выкарыстаннем System.Web.UI;
выкарыстаннем System.Web.UI.WebControls;
I am attempting to implement your solution. However I instead of DropDownList, I only have the option for a DropDownChoiceList. Do you happen to know how to add items to a DropDownChoiceList? Мы выкарыстоўваем SharePoint 2007 SP1 і Visual Studio 2005 SP1.