MOSS: Funksionele Voorbeeld - Custom Data Tipe

Besigheid scenario:

Onderneming breë implementering van MOSS vir produksie-maatskappy met 30+ terreine en 'n paar dosyn korporatiewe departemente.

Besigheid doel:

Ten spyte van 'n menigte van die besigheid groepe (departemente, plekke, ens.), sekere data moet in stand gehou word op 'n globale vlak. Byvoorbeeld, 'n gesaghebbende meester lys van al die fisiese plekke van die maatskappy (bijv. produksie fasiliteite, pakhuis plekke, verkope kantore) behou moet word in 'n sentrale plek.

Tegniese Probleem:

Die onderneming taksonomie is geïmplementeer met behulp van verskeie webwerf versamelings. Ons wil graag die gesaghebbende lys van fisiese plekke te skep in 'n persoonlike WSS lys. Toe, wanneer ons nodig het om 'n kolom in 'n tipe inhoud te hê (of 'n kolom by 'n lys of doc biblioteek) wat vervat korporatiewe plekke, we would create a column using the "lookup" gegee tipe en punt na die meester lys.

Ongelukkig, lookup datatypes must access a source list "locally" Dit beteken dat ons gesaghebbende lys nie kan strek webwerf versamelings.

Tegniese oplossing:

Implementering van 'n nuwe persoonlike data tipe geïmplementeer wat gebaseer is op SPField en voorgestel as 'n DropDown List in die UI wie ListItems vul van die meester WSS lys.

Ons het 'n nuwe tuiste versameling genoem "http://localhost/EnterpriseData". Daar, we created a custom list named "Corporate Locations". This list just uses the standard "Title" veld van die lys van die werklike korporatiewe plekke te bevat.

Een volg 'n paar diskrete stappe om 'n persoonlike data tipe te skep in WSS. Hulle is:

  1. Definieer 'n klas wat erf van SPField ('n mens kan besit van ander velde, indien nodig).

Hier is die kode vir daardie:

openbare klas XYZZYCorporateLocationField : SPFieldText
{
openbare XYZZYCorporateLocationField
(SPFieldCollection velde, string typeName, string displayName)
: basis(velde, typeName, displayName) { }

openbare XYZZYCorporateLocationField
(SPFieldCollection velde, string displayName)
: basis(velde, displayName) { }

openbare oorheers BaseFieldControl FieldRenderingControl
{
kry
{
BaseFieldControl control = nuwe XYZZYCorporateLocationFieldControl();
control.FieldName = hierdie.Interne Naam;
terugkeer control;
} //kry
} // fieldrenderingcontrol

openbare oorheers string GetValidatedString(voorwerp waarde)
{
indien (hierdie.Required || value.ToString().Equals(String.Leë))
{
gooi nuwe SPFieldValidationException ("Department is not assigned.");
}
terugkeer basis.GetValidatedString(waarde);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definieer 'n ander klas wat afgelei van die basis veld beheer, soos in:

openbare klas XYZZYCorporateLocationFieldControl : BaseFieldControl
{
beskerm DropDown List XYZZYCorporateLocationSelector;

beskerm oorheers string DefaultTemplateName
{
kry
{
terugkeer "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

openbare oorheers voorwerp Waarde
{
kry
{
EnsureChildControls();
terugkeer hierdie.XYZZYCorporateLocationSelector.SelectedValue;
} // kry
stel
{
EnsureChildControls();
hierdie.XYZZYCorporateLocationSelector.SelectedValue = (string)hierdie.ItemFieldValue;
} // stel
} // override object Value

beskerm oorheers nietig CreateChildControls()
{

indien (hierdie.Field == nul || hierdie.ControlMode == SPControlMode.Vertoon)
terugkeer;

basis.CreateChildControls();

hierdie.XYZZYCorporateLocationSelector =
(DropDown List)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

indien (hierdie.XYZZYCorporateLocationSelector == nul)
gooi nuwe Uitsondering("ERROR: Cannot load .ASCX file!");

indien (!hierdie.Page.IsPostBack)
{

die gebruik van (SPSite site = nuwe SPSite("Http://localhost / enterprisedata"))
{
die gebruik van (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists["Corporate Locations"];

foreach (SPItem XYZZYCorporateLocation in currentList.Items)
{
indien (XYZZYCorporateLocation["Title"] == nul) voortgaan;

string theTitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();

hierdie.XYZZYCorporateLocationSelector.Items.Add
(nuwe ListItem(theTitle, theTitle));

} // foreach

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost/enterprisedata")

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Die bogenoemde kode implemente basies die logika vir die mense aan die DropDown List, met waardes van die WSS persoonlike lys geleë op http://localhost/enterprisedata and named "Corporate Departments".

Ek gedefinieer beide klasse in 'n enkele. Cs lêer, saamgestel is dit en sit dit in die GAC (sterk vereiste, natuurlik).

  1. Implementering van 'n beheer sjabloon (.ascx) soos aangedui:

<%@ Beheer Taal="C#" Erf="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Weergawe = 12.0.0.0, Kultuur = neutraal,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ Registreer Tagprefix="wssawc" Naamruimte="Microsoft.SharePoint.WebControls" Vergadering="Microsoft.SharePoint, Weergawe = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registreer Tagprefix="SharePoint" Naamruimte="Microsoft.SharePoint.WebControls" Vergadering="Microsoft.SharePoint, Weergawe = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Lewering Sjabloon ID="XYZZYCorporateLocationFieldControl" runat="server">
<Sjabloon>
<ASP:DropDown List ID="XYZZYCorporateLocationSelector" runat="server" />
</Sjabloon>
</
SharePoint:Lewering Sjabloon>

Die bogenoemde is gered in c:\program lêers algemene lêers Microsoft gedeelde web bediener uitbreidings 12 controltemplates.

  1. Ten slotte, skep ons 'n XML lêer te stoor in die ..... 12 XML Gids. Dit is CAML te verduidelik dat ons persoonlike data tipe en vir my voorbeeld, lyk soos hierdie:

<?xml weergawe="1.0" encoding="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Field Naam="Type Name">CorporateLocations</Field>
<
Field Naam="ParentType">Teks</Field>
<
Field Naam="TypeDisplayName">Corporate Locations</Field>
<
Field Naam="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Field>
<
Field Naam="UserCreatable">WAAR</Field>
<
Field Naam="ShowInListCreate">WAAR</Field>
<
Field Naam="ShowInDocumentLibraryCreate">WAAR</Field>
<
Field Naam="ShowInSurveyCreate">WAAR</Field>
<
Field Naam="ShowInColumnTemplateCreate">WAAR</Field>
<
Field Naam="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Weergawe = 1.0.0.0, Culture = neutral, PublicKeyToken=b0b19e85410990c4</Field>
<
RenderPattern Naam="DisplayPattern">
<
Skakel>
<
Expr>
<
Kolom />
</
Expr>

<Geval Waarde=""/>

<Default>
<
HTML>
<![CDATA[
<span style="color:Red"><b>]]>
</
HTML>

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

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

</
Default>
</
Skakel>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" en pas dit op teen die GAC'd vergadering.

Na beweeg al hierdie stukkies in plek, iisreset op die bediener en dit moet almal begin werk mooi.

3 gedagtes oor "MOSS: Funksionele Voorbeeld - Custom Data Tipe

  1. Alexander
    Hi Paul,
    Eerste van alles, Dankie vir die artikel, want dit is baie interessant. Net een vraag;
    Weet jy nie of dit moontlik is korrek 'n pasgemaakte veld tipe te lewer in die datasheet view van 'n lys?
    Want elke pasgemaakte veld tipe I skep dit getoon as lees-alleen in datasheet view (en die MSDN, byvoorbeeld, nie help my baie :-S).
    Dankie
    Antwoord
  2. Lyndsay

    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? Ons is met behulp van SharePoint 2007 SP1 en Visual Studio 2005 SP1.

    Antwoord

Laat 'n antwoord

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk *