MOUSSE: Fonctionnelle exemple-Type de données personnalisé

Scénario d'entreprise:

L'échelle de l'entreprise mise en œuvre de mousse pour l'entreprise de fabrication avec 30+ sites et quelques dizaines des services.

Objectif de l'entreprise:

Malgré une multitude de groupes d'entreprises (départements, emplacements, etc.), certaines données devraient être maintenues à un niveau mondial. Par exemple, une liste principale faisant autoritaire de tous les lieux physiques de l'entreprise (e.g. installations de fabrication, entrepôts, bureaux de vente) devrait être maintenue dans un emplacement central.

Problème technique:

La taxonomie de l'entreprise a été implémentée à l'aide de plusieurs collections de sites. Nous aurions aimé créer la liste faisant autoritaire des emplacements physiques dans une liste personnalisée de WSS. Puis, Quand nous avions besoin d'avoir une colonne dans un type de contenu (ou une colonne ajoutée à une bibliothèque ou une liste doc) qui contenait des sociétés / entreprises, Nous créerions une colonne à l'aide de la recherche"" type de données, pointez sur cette liste principale.

Malheureusement, types de données de recherche doit accéder à une liste de source "localement" ce qui signifie que notre liste officielle ne peut pas s'étendent de collections de sites.

Solution technique:

Mettre en œuvre un nouveau type de données personnalisé mis en œuvre sur la base de SPField et représentée comme un DropDownList dans l'interface utilisateur dont ListItems peupler de la liste principale de WSS.

Nous avons créé une nouvelle collection de site appelée "http://localhost/EnterpriseData". Il, Nous avons créé une liste personnalisée nommée « Sociétés / entreprises ». Cette liste utilise seulement le titre"standard" champ pour contenir la liste des sociétés / entreprises réelles.

On suit plusieurs étapes discrètes pour créer un type de données personnalisé dans WSS. Ils sont:

  1. Définissez une classe qui hérite de SPField (On ne peut hériter d'autres domaines si nécessaire).

Voici le code pour ça:

public classe XYZZYCorporateLocationField : SPFieldText
{
public XYZZYCorporateLocationField
(SPFieldCollection champs, chaîne typeName, chaîne displayName)
: base(champs, typeName, displayName) { }

public XYZZYCorporateLocationField
(SPFieldCollection champs, chaîne displayName)
: base(champs, displayName) { }

public Substituez BaseFieldControl FieldRenderingControl
{
Télécharger
{
BaseFieldControl contrôle = Nouveau XYZZYCorporateLocationFieldControl();
contrôle. FieldName = ce.InternalName;
retour contrôle;
} //Télécharger
} // FieldRenderingControl

public Substituez chaîne GetValidatedString(objet valeur)
{
Si (ce.Obligatoire || valeur. ToString().Est égal à(Chaîne.Vide))
{
jeter Nouveau SPFieldValidationException ("Le ministère n'est pas affecté.");
}
retour base.GetValidatedString(valeur);
} // GetValidatedString

} // XYZZYCorporateLocation

  1. Définir une autre classe qui hérite du contrôle de champ de base, comme dans:

public classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protégé DropDownList XYZZYCorporateLocationSelector;

protégé Substituez chaîne DefaultTemplateName
{
Télécharger
{
retour "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

public Substituez objet Valeur
{
Télécharger
{
EnsureChildControls();
retour ce.SelectedValue XYZZYCorporateLocationSelector.;
} // Télécharger
ensemble
{
EnsureChildControls();
ce.XYZZYCorporateLocationSelector.SelectedValue = (chaîne)ce.ItemFieldValue;
} // ensemble
} // substituer la valeur d'objet

protégé Substituez VOID CreateChildControls()
{

Si (ce.Domaine == null || ce.ControlMode == SPControlMode.Affichage)
retour;

base.CreateChildControls();

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

Si (ce.XYZZYCorporateLocationSelector == null)
jeter Nouveau Exception("ERREUR: Impossible de charger. Fichier ASCX!");

Si (!ce.Page IsPostBack.)
{

à l'aide de (SPSite site = Nouveau SPSite(« http://localhost/enterprisedata"))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Listes[Sociétés / entreprises""];

foreach (SPItem XYZZYCorporateLocation dans currentList.Items)
{
Si (XYZZYCorporateLocation[« Titre"] == null) continuer;

chaîne Titre;
Titre = XYZZYCorporateLocation[« Titre"].ToString();

ce.XYZZYCorporateLocationSelector.Items.Add
(Nouveau ListItem(Titre, Titre));

} // foreach

} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/enterprisedata")

} // Si ce n'est une publication (postback)

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Le code ci-dessus fondamentalement implémente la logique pour remplir le contrôle DropDownList avec les valeurs de la liste personnalisée de WSS, situé à http://localhost/enterprisedata et nommée « les services ».

J'ai défini les deux classes dans un fichier .cs seul, compilé et placez-le dans le global assembly cache (fort nécessaire, Bien sûr).

  1. Mettre en œuvre un modèle de contrôle (.ascx) comme le montre:

<%@ Contrôle Langue= "C#" Hérite="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Toujours" %>
<%
@ S'inscrire TagPrefix= wssawc"" Namespace="Microsoft.SharePoint.WebControls" Assemblée="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ S'inscrire TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assemblée="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= XYZZYCorporateLocationFieldControl"" runat= « server »>
<Modèle>
<ASP:DropDownList ID= XYZZYCorporateLocationSelector"" runat= "serveur" />
</Modèle>
</
SharePoint:RenderingTemplate>

Ce qui précède est enregistré en c:\programme filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Enfin, Nous créons un fichier XML pour enregistrer dans le... 12XML répertoire. Il s'agit de CAML qui définit notre type de données personnalisé et pour mon exemple, ressemble à ceci:

<?XML Version="1.0" codage="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Champ Nom="TypeName">CorporateLocations</Champ>
<
Champ Nom="ParentType">Texte</Champ>
<
Champ Nom="TypeDisplayName">Sociétés / entreprises</Champ>
<
Champ Nom="TypeShortDescription">Toutes les sociétés XYZZY / y compris les installations de fabrication ou d'autres.</Champ>
<
Champ Nom="UserCreatable">VRAI</Champ>
<
Champ Nom="ShowInListCreate">VRAI</Champ>
<
Champ Nom="ShowInDocumentLibraryCreate">VRAI</Champ>
<
Champ Nom="ShowInSurveyCreate">VRAI</Champ>
<
Champ Nom="ShowInColumnTemplateCreate">VRAI</Champ>
<
Champ Nom="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = b0b19e85410990c4</Champ>
<
RenderPattern Nom="DisplayPattern">
<
Commutateur>
<
Expr>
<
Colonne />
</
Expr>

<Affaire Valeur=""/>

<Par défaut>
<
HTML>
<![CDATA[
<span style = "color:Red"><b>]]>
</
HTML>

<
Colonne SubColumnNumber="0" HTMLEncode="VRAI"/>

<HTML><![CDATA[</b></travée>]]></HTML>

</
Par défaut>
</
Commutateur>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Ce fichier XML ajoute le type de données personnalisé à la "bibliothèque WSS" et il matches contre le GAC a l'Assemblée.

Après avoir déménagé tous ces bits en place, iisreset sur le serveur et il devrait démarrer tous fonctionne bien.

3 réflexions sur "MOUSSE: Fonctionnelle exemple-Type de données personnalisé

  1. Alejandro
    Bonjour Paul,
    Tout d'abord, Merci pour l'article, car il est très intéressant. Seule question;
    Savez-vous si il est posible pour restituer correctement un type de champ personnalisé dans le mode feuille de données d'une liste?
    Parce que chaque type de champ personnalisé, je l'ai créer apparaît en lecture seule en mode feuille de données (et le site Web MSDN, par exemple, ne m'aide pas beaucoup :-S).
    Merci
    Réponse
  2. Lyndsay

    Je cherche à mettre en œuvre votre solution. Cependant j'ai au lieu de DropDownList, Je n'ai que l'option pour un DropDownChoiceList. Vous arrive de savoir comment ajouter des éléments à un DropDownChoiceList? Nous sommes à l'aide de SharePoint 2007 SP1 et Visual Studio 2005 SP1.

    Réponse

Laisser une réponse

Votre adresse email ne sera pas publiée. les champs requis sont indiqués *