MOOS: Funktionale Beispiel – benutzerdefinierten Datentyp

Business-Szenario:

Unternehmensweite Implementierung des MOOSES für Unternehmen mit 30+ Standorte und ein paar Dutzend Zentralbereiche.

Geschäftsziel:

Trotz einer Vielzahl von Unternehmensgruppen (Abteilungen, Standorte, usw.), bestimmte Daten sollten auf globaler Ebene gepflegt werden. Zum Beispiel, eine autorisierende master-Liste von allen Standorten des Unternehmens (zB. Produktionsstätten, Lagerstandorte, Vertriebsbüros) sollte an einem zentralen Ort beibehalten werden.

Technisches Problem:

Die Enterprise-Taxonomie wurde mit mehrere Websitesammlungen implementiert. Wir hätten gerne die autorisierende Liste der physischen Standorten in einer benutzerdefinierten WSS-Liste erstellen. Dann, Wenn wir brauchten, um eine Spalte in einem Inhaltstyp zu haben (oder eine Spalte einer Liste oder Doc-Bibliothek hinzugefügt) enthalten Firmenstandorten, Wir würden eine Spalte mithilfe des "Lookups schaffen." DataType und zeigen Sie auf dieser Masterliste.

Leider, Lookup-Datentypen müssen eine Liste "Quelle" "lokal zugreifen." Was bedeutet, dass unsere maßgebliche Liste Websitesammlungen erstrecken kann nicht.

Technische Lösung:

Implementierung ein neuen benutzerdefinierten Datentyps implementiert basierend auf SPField und als ein DropDownList in der Benutzeroberfläche, deren ListItems aus der WSS-Masterliste auffüllen, dargestellt.

Wir erschaffen eine neue Websitesammlung genannt "http://localhost/EnterpriseData". Dort, Wir haben eine benutzerdefinierte Liste mit dem Namen "Standorte". Diese Liste nutzt nur den standard "Titel" Feld, um die Liste der aktuellen Standorte enthalten.

Folgt man mehrere diskrete Schritte erstellen einen benutzerdefinierten Datentyp in WSS. Sie sind:

  1. Definieren Sie eine Klasse, die von SPField erbt (Man kann aus anderen Bereichen erben, falls erforderlich).

Hier ist der Code für das:

öffentliche Klasse XYZZYCorporateLocationField : SPFieldText
{
öffentliche XYZZYCorporateLocationField
(SPFieldCollection Felder, Zeichenfolge typeName, Zeichenfolge displayName)
: Base(Felder, typeName, displayName) { }

öffentliche XYZZYCorporateLocationField
(SPFieldCollection Felder, Zeichenfolge displayName)
: Base(Felder, displayName) { }

öffentliche Überschreiben BaseFieldControl FieldRenderingControl
{
Erhalten
{
BaseFieldControl Steuerung = Neu XYZZYCorporateLocationFieldControl();
Kontrolle. FieldName = Dies.InternalName;
Rückkehr Kontrolle;
} //Erhalten
} // fieldrenderingcontrol

öffentliche Überschreiben Zeichenfolge GetValidatedString(Objekt Wert)
{
If (Dies.Erforderlich || Wert. ToString().Entspricht(String.Leer))
{
werfen Neu SPFieldValidationException ("Abteilung ist nicht zugewiesen.");
}
Rückkehr Base.GetValidatedString(Wert);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definieren einer anderen Klasse, die aus dem Basisfeld-Steuerelement erbt, wie in:

öffentliche Klasse XYZZYCorporateLocationFieldControl : BaseFieldControl
{
geschützt DropDownList XYZZYCorporateLocationSelector;

geschützt Überschreiben Zeichenfolge DefaultTemplateName
{
Erhalten
{
Rückkehr "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

öffentliche Überschreiben Objekt Wert
{
Erhalten
{
EnsureChildControls();
Rückkehr Dies.XYZZYCorporateLocationSelector.SelectedValue;
} // Erhalten
Satz
{
EnsureChildControls();
Dies.XYZZYCorporateLocationSelector.SelectedValue = (Zeichenfolge)Dies.ItemFieldValue;
} // Satz
} // Objekt Wert überschreiben

geschützt Überschreiben privatevoid CreateChildControls()
{

If (Dies.Feld == NULL || Dies.ControlMode == SPControlMode.Display)
Rückkehr;

Base.CreateChildControls();

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

If (Dies.XYZZYCorporateLocationSelector == NULL)
werfen Neu Ausnahme("FEHLER: Kann nicht geladen werden. ASCX-Datei!");

If (!Dies.IsPostBack-Seite.)
{

Verwendung (SPSite Website = Neu SPSite("http://Localhost/enterprisedata"))
{
Verwendung (SPWeb Web = Site. OpenWeb())
{

SPList CurrentList = Web. Listen["Standorte"];

foreach (SPItem XYZZYCorporateLocation im currentList.Items)
{
If (XYZZYCorporateLocation["Titel"] == NULL) weiter;

Zeichenfolge theTitle;
TheTitle = XYZZYCorporateLocation["Titel"].ToString();

Dies.XYZZYCorporateLocationSelector.Items.Add
(Neu ListItem(theTitle, theTitle));

} // foreach

} // mit Spweb Web = site.openweb()
} // Nutzung Spsite Site = neue Spsite("http://"localhost"/ Enterprisedata")

} // Wenn kein postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Der obige Code implementiert grundsätzlich die Logik zum Auffüllen der Dropdownliste mit Werten aus der WSS benutzerdefinierte Liste befindet sich am http://localhost/enterprisedata und benannte "Abteilungen".

Ich habe definiert beide Klassen in einer einzigen .cs-Datei, Es kompiliert und legen Sie sie in den GAC (starke erforderlich, Natürlich).

  1. Implementieren einer Steuerelementvorlage (.ASCX-Datei) wie gezeigt:

<%@ Kontrolle Sprache= "C#" Erbt="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = Neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Immer" %>
<%
@ Registrieren TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Montage="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = Neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrieren TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montage="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = Neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "Server">
<Vorlage>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "server" />
</Vorlage>
</
SharePoint:RenderingTemplate>

Die oben genannten wird in c gespeichert:\Programm c:ProgrammeGemeinsame Dateienmicrosoft Sharedweb Server extensions12controltemplates.

  1. Schließlich, Wir erstellen eine XML-Datei speichern Sie in der... 12XML-Verzeichnis. Dies ist CAML, die unsere benutzerdefinierten Datentyp definiert und für mein Beispiel, sieht wie folgt aus:

<?XML Version="1.0" Codierung="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Feld Name="TypeName">CorporateLocations</Feld>
<
Feld Name="ParentType">Text</Feld>
<
Feld Name="TypeDisplayName">Firmenstandorten</Feld>
<
Feld Name="TypeShortDescription">Alle XYZZY Firmenstandorten einschließlich Herstellungs- oder andere Einrichtungen.</Feld>
<
Feld Name="UserCreatable">WAHRE</Feld>
<
Feld Name="ShowInListCreate">WAHRE</Feld>
<
Feld Name="ShowInDocumentLibraryCreate">WAHRE</Feld>
<
Feld Name="ShowInSurveyCreate">WAHRE</Feld>
<
Feld Name="ShowInColumnTemplateCreate">WAHRE</Feld>
<
Feld Name="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Kultur = Neutral, PublicKeyToken = b0b19e85410990c4</Feld>
<
RenderPattern Name="DisplayPattern">
<
Schalter>
<
Expr>
<
Spalte />
</
Expr>

<Fall Wert=""/>

<Standard>
<
HTML>
<![CDATA[
<span Style = "Farbe:Red"><b>]]>
</
HTML>

<
Spalte SubColumnNumber="0" HTMLEncode="WAHRE"/>

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

</
Standard>
</
Schalter>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Diese XML-Datei hinzugefügt den benutzerdefinierten Datentyp die WSS "Bibliothek" und vergleicht ihn mit dem GAC hatte Versammlung.

Nach dem Umzug dieser Bits in Ort, Iisreset auf dem Server und es sollten alle schön Arbeit beginnen.

3 Gedanken zu „MOOS: Funktionale Beispiel – benutzerdefinierten Datentyp

  1. Alejandro
    Hallo Paul,
    Zuallererst, Vielen Dank für den Artikel, denn es ist sehr interessant. Nur noch eine Frage;
    Du weißt, wenn es posible einen benutzerdefinierten Feldtyp in der Datenblattansicht einer Liste korrekt dargestellt ist?
    Weil jedes benutzerdefinierte Feldtyp ich es schaffen als Read-only in der Datenblattansicht angezeigt wird (und im MSDN, zum Beispiel, hilft mir nicht sehr viel :-S).
    Vielen Dank
    Antwort
  2. Lyndsay

    Ich bin versucht, Ihre Lösung zu implementieren.. Jedoch ich statt DropDownList, Ich habe nur die Option für eine DropDownChoiceList. Kennen Sie wissen, wie ein DropDownChoiceList Elemente hinzu? Wir verwenden SharePoint 2007 SP1 und Visual Studio 2005 SP1.

    Antwort

Hinterlasse eine Antwort

Deine Email-Adresse wird nicht veröffentlicht. erforderliche Felder sind markiert *