MOSS: Functioneel voorbeeld – aangepast gegevenstype

Bedrijfsscenario:

Ondernemingswijde uitvoering van MOSS voor productiebedrijf met 30+ sites en een paar dozijn stafafdelingen.

Zakelijke doel:

Ondanks een veelheid van business groups (afdelingen, locaties, etc), bepaalde gegevens moeten worden gehandhaafd op een mondiaal niveau. Bijvoorbeeld, een gezaghebbende hoofdlijst van alle fysieke locaties van het bedrijf (bijvoorbeeld. productiefaciliteiten, magazijn locaties, verkoopkantoren) moet worden gehandhaafd op een centrale locatie.

Technisch probleem:

De taxonomie van de onderneming werd uitgevoerd met behulp van meerdere siteverzamelingen. Wij hadden gewild de gezaghebbende lijst van fysieke locaties maken in een aangepaste WSS-lijst. Vervolgens, Wanneer we die nodig is om een kolom in een inhoudstype (of een kolom toegevoegd aan een lijst of doc bibliotheek) die opgenomen corporate locaties, We zouden een kolom met behulp van de "lookup maken" datatype en punt aan dit master lijst.

Helaas, opzoeken datatypes moet toegang hebben tot een bronlijst 'lokaal" Wat betekent dat onze gezaghebbende lijst niet meerdere siteverzamelingen kunnen omvatten.

Technische oplossing:

Uitvoering van een nieuwe aangepaste gegevenstype ten uitvoer gelegd op basis van SPField en vertegenwoordigd als een DropDownList in de UI waarvan ListItems vanuit de hoofdlijst WSS vullen.

We hebben een nieuwe siteverzameling genoemd gemaakt "http://localhost/EnterpriseData". Er, we gemaakt een aangepaste lijst met de naam 'Corporate locaties'. Deze lijst gebruikt enkel de standaard "titel" veld bevatten de lijst van werkelijke corporate locaties.

Een volgt verschillende discrete stappen voor het maken van een aangepast gegevenstype in WSS. Ze zijn:

  1. Een klasse die van SPField overerft definiëren (Men kan erven van andere velden indien nodig).

Hier is de code voor dat:

openbare klasse XYZZYCorporateLocationField : SPFieldText
{
openbare XYZZYCorporateLocationField
(SPFieldCollection velden, tekenreeks typeName, tekenreeks displayName)
: Base(velden, typeName, displayName) { }

openbare XYZZYCorporateLocationField
(SPFieldCollection velden, tekenreeks displayName)
: Base(velden, displayName) { }

openbare overschrijven BaseFieldControl FieldRenderingControl
{
Toevoegen
{
BaseFieldControl controle = Nieuw XYZZYCorporateLocationFieldControl();
controle. FieldName = Dit.InternalName;
terugkeer controle;
} //Toevoegen
} // fieldrenderingcontrol

openbare overschrijven tekenreeks GetValidatedString(object waarde)
{
Als (Dit.Vereist || waarde. ToString().Is gelijk aan(Tekenreeks.Leeg))
{
gooien Nieuw SPFieldValidationException ("Departement is niet toegewezen.");
}
terugkeer Base.GetValidatedString(waarde);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Een andere klasse die van het basisveld besturingselement overerft definiëren, Als in:

openbare klasse XYZZYCorporateLocationFieldControl : BaseFieldControl
{
beschermd DropDownList XYZZYCorporateLocationSelector;

beschermd overschrijven tekenreeks DefaultTemplateName
{
Toevoegen
{
terugkeer "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

openbare overschrijven object Waarde
{
Toevoegen
{
EnsureChildControls();
terugkeer Dit.XYZZYCorporateLocationSelector.SelectedValue;
} // Toevoegen
instellen
{
EnsureChildControls();
Dit.XYZZYCorporateLocationSelector.SelectedValue = (tekenreeks)Dit.ItemFieldValue;
} // instellen
} // object waarde overschrijven

beschermd overschrijven VOID CreateChildControls()
{

Als (Dit.Veld == Null || Dit.ControlMode == SPControlMode.Weergave)
terugkeer;

Base.CreateChildControls();

Dit.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

Als (Dit.XYZZYCorporateLocationSelector == Null)
gooien Nieuw Uitzondering("FOUT: Kan niet laden. ASCX bestand!");

Als (!Dit.IsPostBack de pagina.)
{

met behulp van (SPSite site = Nieuw SPSite('http://localhost/enterprisedata"))
{
met behulp van (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Lijsten['Corporate locaties"];

foreach (SPItem XYZZYCorporateLocation in currentList.Items)
{
Als (XYZZYCorporateLocation["Titel"] == Null) «««;

tekenreeks Krijgt;
Krijgt = XYZZYCorporateLocation["Titel"].ToString();

Dit.XYZZYCorporateLocationSelector.Items.Add
(Nieuw ListItem(Krijgt, Krijgt));

} // foreach

} // met behulp van spweb web = site.openweb()
} // gebruik van spsite site = nieuwe spsite('http://localhost/enterprisedata")

} // Als niet een terugsturen

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

De bovenstaande code implementeert in principe de logica voor het vullen van de DropDownList met waarden uit de WSS aangepaste lijst attractiepark http://localhost/enterprisedata en met de naam "Corporate afdelingen".

Ik heb beide klassen gedefinieerd in een enkele .cs-bestand, gecompileerd het en zet het in de GAC (sterke vereist, Natuurlijk).

  1. Uitvoering van een besturingselement sjabloon (.AScX) zoals:

<%@ Controle Taal= "C#" Erft="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versie = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Always" %>
<%
@ Registreren Tagprefix"wssawc =" Namespace="Microsoft.SharePoint.WebControls" Vergadering="Microsoft.SharePoint, Versie = 12.0.0.0, Cultuur = neutraal, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registreren Tagprefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Vergadering="Microsoft.SharePoint, Versie = 12.0.0.0, Cultuur = neutraal, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID"XYZZYCorporateLocationFieldControl =" RUNAT= "server">
<Sjabloon>
<ASP:DropDownList ID"XYZZYCorporateLocationSelector =" RUNAT= "server" />
</Sjabloon>
</
SharePoint:RenderingTemplate>

Het bovenstaande wordt opgeslagen in c:\Program filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Tot slot, We creëren een XML-bestand op te slaan in de... 12XML directory. Dit is CAML waarin onze aangepaste gegevenstype en voor mijn voorbeeld, ziet er als volgt:

<?XML Versie="1.0" codering="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Veld Naam="TypeName">CorporateLocations</Veld>
<
Veld Naam="ParentType">Tekst</Veld>
<
Veld Naam="TypeDisplayName">Corporate locaties</Veld>
<
Veld Naam="TypeShortDescription">Alle Corporate XYZZY locaties met inbegrip van de productie- of andere voorzieningen.</Veld>
<
Veld Naam="UserCreatable">WAAR</Veld>
<
Veld Naam="ShowInListCreate">WAAR</Veld>
<
Veld Naam="ShowInDocumentLibraryCreate">WAAR</Veld>
<
Veld Naam="ShowInSurveyCreate">WAAR</Veld>
<
Veld Naam="ShowInColumnTemplateCreate">WAAR</Veld>
<
Veld Naam="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versie = 1.0.0.0, Cultuur = neutraal, PublicKeyToken = b0b19e85410990c4</Veld>
<
RenderPattern Naam="DisplayPattern">
<
Schakelaar>
<
Expr>
<
Kolom />
</
Expr>

<Geval Waarde=""/>

<Standaard>
<
HTML>
<![CDATA[
<span stijl = "kleur:Red"><b>]]>
</
HTML>

<
Kolom SubColumnNumber="0" HTMLEncode="WAAR"/>

<HTML><![CDATA[</b></span>]]></HTML>

</
Standaard>
</
Schakelaar>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Dit XML-bestand wordt het aangepaste gegevenstype toegevoegd aan de WSS "bibliotheek" en komt overeen met het op tegen de GAC hadden vergadering.

Na het verplaatsen van al deze stukjes op zijn plaats, iisreset op de server en het moet alle gaan werken mooi.

3 gedachten over "MOSS: Functioneel voorbeeld – aangepast gegevenstype

  1. Alejandro
    Hallo Paul,
    Allereerst, Bedankt voor het artikel, omdat het is zeer interessant. Slechts één vraag;
    Ken jij als het is posible correct weer te geven een type aangepast veld in de gegevensbladweergave van een lijst?
    Omdat elke aangepaste veldtype ik maken het als alleen-lezen wordt weergegeven in de gegevensbladweergave (en de MSDN, bijvoorbeeld, niet helpen zeer veel me :-S).
    Bedankt
    Antwoord
  2. Lyndsay
    Postuur op uiterlijk! Net nodig om toe te voegen

    met behulp van System.Web.UI;
    met behulp van System.Web.UI.WebControls;

    Antwoord
  3. Lyndsay

    Ik probeer om uw oplossing te implementeren. Echter ik in plaats van DropDownList, Ik heb alleen de optie voor een DropDownChoiceList. U weet toevallig weten hoe items toevoegen aan een DropDownChoiceList? We zijn met behulp van SharePoint 2007 SP1 en Visual Studio 2005 SP1.

    Antwoord

Laat een antwoord achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *