Scenariu de afaceri:
Implementarea la nivel de Intreprindere MOSS pentru companie de producţie cu 30+ site-uri şi câteva zeci de departamentele corporative.
Obiectivul de afaceri:
În ciuda o multitudine de grupuri de afaceri (departamente, Locatii, etc), anumite date trebuie menținute la un nivel global. De exemplu, o autoritate lista master toate locaţiile fizice ale companiei (ex. facilităţi de producţie, locaţii de depozit, birouri de vânzări) ar trebui să fie menţinute într-o locaţie centrală.
Probleme tehnice:
Taxonomia Intreprindere a fost implementat folosind mai multe colecții de site-ul. Ne-ar fi plăcut să creeze autoritate lista de locaţii fizice într-o listă particularizată de AAC. Apoi, Când am nevoie pentru a avea o coloană într-un tip de conținut (sau o coloană de adăugat la o lista sau doc bibliotecă) care conţinea locatiile corporate, ne-ar crea o coloană utilizând "căutare" tip de date şi punct la această listă de maestru.
Din păcate, tipurile de date de căutare trebuie să accesa o listă de sursa "la nivel local" însemnând că lista noastră de autoritate nu cuprind colecţii de site-ul.
Soluţii tehnice:
Implementarea unui nou tip de date personalizate puse în aplicare pe baza SPField şi reprezentat ca un DropDownList în interfaţa utilizator a cărui ListItems popula din lista AAC maestru.
Am creat o colecţie de site-ul nou numit "http://localhost/EnterpriseData". Acolo, am creat o listă particularizată numit "Locatiile Corporate". Această listă utilizează doar standard "titlul" câmp să conţină lista de locaţii reale corporative.
Unul urmează mai multe etape discret pentru a crea un tip de date predefinite în AAC. Ele sunt:
- Definiţi o clasă care moștenește de la SPField (unul poate moşteni din alte domenii, dacă este necesar).
Aici este codul pentru că:
publice Clasa XYZZYCorporateLocationField : SPFieldText
{
publice XYZZYCorporateLocationField
(SPFieldCollection câmpuri, şir typeName, şir displayName)
: baza(câmpuri, typeName, displayName) { }
publice XYZZYCorporateLocationField
(SPFieldCollection câmpuri, şir displayName)
: baza(câmpuri, displayName) { }
publice suprascrie BaseFieldControl FieldRenderingControl
{
obţine
{
BaseFieldControl controlul = noi XYZZYCorporateLocationFieldControl();
controlul. Denumirea câmpului = Acest lucru.InternalName;
reveni controlul;
} //obţine
} // fieldrenderingcontrol
publice suprascrie şir GetValidatedString(obiect valoarea)
{
Dacă (Acest lucru.Necesare || valoare. ToString().Este egal cu(Şir.Gol))
{
arunca noi SPFieldValidationException ("Departamentul nu este alocat.");
}
reveni baza.GetValidatedString(valoarea);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Defini o altă clasă care moștenește de la controlul bazei câmp, ca şi în:
publice Clasa XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protejate DropDownList XYZZYCorporateLocationSelector;
protejate suprascrie şir DefaultTemplateName
{
obţine
{
reveni "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
publice suprascrie obiect Valoarea
{
obţine
{
EnsureChildControls();
reveni Acest lucru.XYZZYCorporateLocationSelector.SelectedValue;
} // obţine
set
{
EnsureChildControls();
Acest lucru.XYZZYCorporateLocationSelector.SelectedValue = (şir)Acest lucru.ItemFieldValue;
} // set
} // suprascrie obiect valoare
protejate suprascrie nule CreateChildControls()
{
Dacă (Acest lucru.Domeniul == nul || Acest lucru.ControlMode == SPControlMode.Afişare)
reveni;
baza.CreateChildControls();
Acest lucru.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer. FindControl("XYZZYCorporateLocationSelector");
Dacă (Acest lucru.XYZZYCorporateLocationSelector == nul)
arunca noi Excepţie("EROARE: Imposibil de încărcat. Fișierul ASCX!");
Dacă (!Acest lucru.Pagina de IsPostBack.)
{
folosind (SPSite site-ul = noi SPSite("http://localhost/enterprisedata"))
{
folosind (SPWeb web = site-ul. OpenWeb())
{
SPList.Update() currentList = web. Liste["Locatii corporativă"];
foreach (SPItem XYZZYCorporateLocation în currentList.Items)
{
Dacă (XYZZYCorporateLocation["Titlul"] == nul) «««;
şir theTitle;
theTitle = XYZZYCorporateLocation["Titlul"].ToString();
Acest lucru.XYZZYCorporateLocationSelector.Items.Add
(noi ListItem(theTitle, theTitle));
} // foreach
} // folosind spweb web = site.openweb()
} // folosind site-ul spsite = nou spsite("http://localhost/enterprisedata")
} // Dacă nu o postback
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
Codul de mai sus practic implementează logica pentru popularea DropDownList cu valori din listă particularizată AAC situat la http://localhost/enterprisedata şi numit "departamentele companiei".
Am definit ambele clase într-un fişier unic .cs, compilat-o şi pune-l în GAC (puternic solicitate, desigur).
-
Aplicarea unui şablon de control (.ascx) ca:
<%@ Controlul Limba= "C#" Moștenește="Microsoft.SharePoint.portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.portal,Versiune = 12.0.0.0, Cultură = neutră,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Întotdeauna" %>
<%@ Înregistrează-te TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Asamblare="Microsoft.SharePoint, Versiune = 12.0.0.0, Cultură = neutră, PublicKeyToken = 71e9bce111e9429c" %> <%@ Înregistrează-te TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Asamblare="Microsoft.SharePoint, Versiune = 12.0.0.0, Cultură = neutră, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID-UL= "XYZZYCorporateLocationFieldControl" Runat= "server">
<Şablon>
<ASP:DropDownList ID-UL= "XYZZYCorporateLocationSelector" Runat= "serverul" />
</Şablon>
</SharePoint:RenderingTemplate>
Cele de mai sus este stocat în c:\Programul filescommon filesmicrosoft sharedweb server extensions12controltemplates.
- În cele din urmă, vom crea un fişier XML pentru a salva în... 12XML Director. Acest lucru este florin care defineşte tipul nostru de date personalizate şi exemplu meu, se pare ca acest lucru:
<?XML versiunea="1.0" codificarea="UTF-8" ?>
<FieldTypes>
<FieldType>
<Câmp nume="TypeName">CorporateLocations</Câmp>
<Câmp nume="ParentType">Textul</Câmp>
<Câmp nume="TypeDisplayName">Locatiile corporate</Câmp>
<Câmp nume="TypeShortDescription">Toate locaţiile XYZZY corporative, inclusiv facilităţi de fabricație sau alte.</Câmp>
<Câmp nume="UserCreatable">ADEVĂRAT</Câmp>
<Câmp nume="ShowInListCreate">ADEVĂRAT</Câmp>
<Câmp nume="ShowInDocumentLibraryCreate">ADEVĂRAT</Câmp>
<Câmp nume="ShowInSurveyCreate">ADEVĂRAT</Câmp>
<Câmp nume="ShowInColumnTemplateCreate">ADEVĂRAT</Câmp>
<Câmp nume="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versiunea = 1.0.0.0, Cultură = neutră, PublicKeyToken = b0b19e85410990c4</Câmp>
<RenderPattern nume="DisplayPattern">
<Comutator>
<Expr>
<Coloană />
</Expr>
<Caz Valoarea=""/>
<În mod implicit>
<HTML>
<![CDATA[<stil de control = "culoare:Roşu"><b>]]>
</HTML>
<Coloană SubColumnNumber="0" HTMLEncode="ADEVĂRAT"/>
<HTML><![CDATA[</b></durata de>]]></HTML>
</În mod implicit>
</Comutator>
</RenderPattern>
</FieldType>
</FieldTypes>
Acest fişier XML adaugă tipul de date particularizate pentru a AAC "Biblioteca" şi se potriveşte împotriva GAC au avut Adunarea.
După toate aceste biţi, se deplasează în locul, iisreset pe server şi acesta ar trebui să toate începe să lucreze frumos.
Utilizarea System.Web.UI;
Utilizarea System.Web.UI.WebControls;
Sunt încearcă să pună în aplicare solutia ta. Cu toate acestea am în loc de DropDownList, Am doar opţiunea pentru un DropDownChoiceList. Ai întâmpla să ştiu cum să adăugaţi elemente la o DropDownChoiceList? Suntem folosind SharePoint 2007 SP1 şi Visual Studio 2005 SP1.