MUSCHIO: Esempio funzionale – tipo di dati personalizzati

Scenario business:

Implementazione Enterprise-wide di MOSS per società di produzione con 30+ siti e qualche dozzina dipartimenti aziendali.

Obiettivo aziendale:

Nonostante una moltitudine di gruppi aziendali (dipartimenti, posizioni, ecc), alcuni dati devono essere mantenuti a livello globale. Per esempio, un autorevole elenco principale di tutti i luoghi fisici dell'azienda (e. g. impianti di produzione, posizioni di magazzino, uffici vendite) dovrebbe essere mantenuto in una posizione centrale.

Problema tecnico:

La tassonomia aziendale è stata implementata utilizzando più raccolte siti. Ci sarebbe piaciuto creare l'elenco autorevole dei luoghi fisici in un elenco personalizzato di WSS. Poi, Quando abbiamo bisogno di avere una colonna in un tipo di contenuto (o aggiunta di una colonna in un elenco o doc libreria) che conteneva le posizioni aziendali, si creerebbe una colonna utilizzando la ricerca"" DataType e punto di questo elenco master.

Purtroppo, ricerca datatypes deve accedere a un elenco di origine "localmente" significa che il nostro autorevole elenco non può occupare più raccolte siti.

Soluzione tecnica:

Implementare un nuovo tipo di dati personalizzata implementata sulla base di SPField e rappresentato come un oggetto DropDownList nell'interfaccia utente di cui ListItems popolare dall'elenco principale di WSS.

Abbiamo creato una nuova collezione di sito chiamata "http://localhost/EnterpriseData". Ci, Abbiamo creato un elenco personalizzato denominato "Sedi aziendali". Questo elenco viene utilizzato solo il titolo"standard" campo per contenere l'elenco delle sedi aziendali reali.

Uno segue diversi passaggi discreti per creare un tipo di dati personalizzati in WSS. Essi sono:

  1. Definire una classe che eredita da SPField (uno può ereditare da altri campi, se richiesto).

Ecco il codice per questo:

pubblica classe XYZZYCorporateLocationField : SPFieldText
{
pubblica XYZZYCorporateLocationField
(SPFieldCollection campi, stringa typeName, stringa displayName)
: base(campi, typeName, displayName) { }

pubblica XYZZYCorporateLocationField
(SPFieldCollection campi, stringa displayName)
: base(campi, displayName) { }

pubblica eseguire l'override BaseFieldControl FieldRenderingControl
{
Ottieni
{
BaseFieldControl controllo = Nuovo XYZZYCorporateLocationFieldControl();
controllo. FieldName = Questo.InternalName;
ritorno controllo;
} //Ottieni
} // fieldrenderingcontrol

pubblica eseguire l'override stringa GetValidatedString(oggetto valore)
{
Se (Questo.Obbligatorio || valore. ToString().È uguale a(Stringa.Vuoto))
{
Throw Nuovo SPFieldValidationException ("Il dipartimento non è assegnato.");
}
ritorno base.GetValidatedString(valore);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definire un'altra classe che eredita dal controllo campo base, come in:

pubblica classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protetti DropDownList XYZZYCorporateLocationSelector;

protetti eseguire l'override stringa DefaultTemplateName
{
Ottieni
{
ritorno "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

pubblica eseguire l'override oggetto Valore
{
Ottieni
{
EnsureChildControls();
ritorno Questo.XYZZYCorporateLocationSelector. SelectedValue;
} // Ottieni
impostare
{
EnsureChildControls();
Questo.XYZZYCorporateLocationSelector.SelectedValue = (stringa)Questo.ItemFieldValue;
} // impostare
} // eseguire l'override object valore

protetti eseguire l'override void Metodo CreateChildControls()
{

Se (Questo.Campo = = null || Questo.ControlMode = = SPControlMode.Visualizzazione)
ritorno;

base.Metodo CreateChildControls();

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

Se (Questo.XYZZYCorporateLocationSelector = = null)
Throw Nuovo Eccezione("ERRORE: Impossibile caricare. File ASCX!");

Se (!Questo.IsPostBack pagina.)
{

utilizzando (SPSite sito = Nuovo SPSite("http://localhost/enterprisedata"))
{
utilizzando (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Elenchi["Sedi aziendali"];

foreach (SPItem XYZZYCorporateLocation in currentList.Items)
{
Se (XYZZYCorporateLocation["Title"] == null) continuare;

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

Questo.XYZZYCorporateLocationSelector.Items.Add
(Nuovo ListItem(theTitle, theTitle));

} // foreach

} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/enterprisedata")

} // Se non un postback

} // Metodo CreateChildControls

} // XYZZYCorporateLocationFieldControl

Il codice sopra fondamentalmente implementa la logica per popolare la DropDownList con i valori dall'elenco personalizzato WSS situato presso http://localhost/enterprisedata e denominato "reparti aziendali".

Entrambe le classi definito in un file singolo con estensione., compilato e messo in GAC (necessaria forte, Naturalmente).

  1. Implementare un modello di controllo (.ascx) come illustrato:

<%@ Controllo Lingua= "C#" Eredita="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versione = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sempre" %>
<%
@ Registro TagPrefix= wssawc"" Namespace="Microsoft.SharePoint.WebControls" Assemblea="Microsoft.SharePoint, Versione = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registro TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assemblea="Microsoft.SharePoint, Versione = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= XYZZYCorporateLocationFieldControl"" runat= "server">
<Modello>
<ASP:DropDownList ID= XYZZYCorporateLocationSelector"" runat= "server" />
</Modello>
</
SharePoint:RenderingTemplate>

Quanto sopra viene salvato in c:\programma c:ProgrammiFile comuniMicrosoft sharedweb server extensions12controltemplates.

  1. Infine, Creiamo un file XML per salvare nella... 12XML directory. Questo è CAML che definisce il nostro tipo di dati personalizzato e per il mio esempio, assomiglia a questo:

<?XML Versione="1.0" codifica="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Testo</Campo>
<
Campo Nome="TypeDisplayName">Sedi aziendali</Campo>
<
Campo Nome="TypeShortDescription">Tutte le località XYZZY aziendale, compresi gli impianti di fabbricazione o di altri.</Campo>
<
Campo Nome="UserCreatable">VERO</Campo>
<
Campo Nome="ShowInListCreate">VERO</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">VERO</Campo>
<
Campo Nome="ShowInSurveyCreate">VERO</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">VERO</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Cultura = neutral, PublicKeyToken = b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Interruttore>
<
Expr>
<
Colonna />
</
Expr>

<Caso Valore=""/>

<Predefinito>
<
HTML>
<![CDATA[
<span style = "color:Rosso"><b>]]>
</
HTML>

<
Colonna SubColumnNumber="0" HTMLEncode="VERO"/>

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

</
Predefinito>
</
Interruttore>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Questo file XML aggiunge il tipo di dati personalizzati per il WSS "biblioteca" e fiammiferi esso contro il GAC ha avuto Assemblea.

Dopo lo spostamento di tutti questi bit in luogo, iisreset sul server e si dovrebbe iniziare tutti a lavorare piacevolmente.

3 pensieri su "MUSCHIO: Esempio funzionale – tipo di dati personalizzati

  1. Alejandro
    Ciao Paolo,
    Prima di tutto,, Grazie per l'articolo, perché è molto interessante. Solo una domanda;
    Sai se è posible per eseguire il rendering correttamente un tipo di campo personalizzato nella visualizzazione Foglio dati di una lista?
    Perché ogni tipo di campo personalizzato crea si è dimostrato come di sola lettura in visualizzazione Foglio dati (e il MSDN, per esempio, non mi aiuta molto :-S).
    Grazie
    Risposta
  2. Lyndsay

    Sto tentando di implementare la soluzione. Tuttavia io invece DropDownList, Ho solo l'opzione per un DropDownChoiceList. Ti capita di sapere come aggiungere elementi a un DropDownChoiceList? Stiamo utilizzando SharePoint 2007 SP1 e Visual Studio 2005 SP1.

    Risposta

Lasciare una risposta

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *