MECH: Funkční příklad – vlastní datový typ

Obchodní scénář:

Celopodnikové implementace Moss pro výrobní společnosti s 30+ sítě a pár desítek firemních oddělení.

Předmět podnikání:

I přes velké množství obchodních skupin (oddělení, umístění, atd), některé údaje by měla být udržována na globální úrovni. Například, autoritativní hlavní seznam všech fyzické umístění firmy (např.. výrobní zařízení, skladových lokací, prodejní kanceláře) by měl být zachován v centrálním umístění.

Technický problém:

Taxonomie organizace byl realizován pomocí více kolekcí webů. Bychom si přáli vytvořit autoritativní seznam fyzické umístění v seznamu vlastní WSS. Pak, Když jsme potřebovali mít sloupce typu obsahu (nebo sloupec do seznamu nebo dokumentu knihovny) který obsahoval místech firmy, Vytváříme sloupec pomocí vyhledávání"" datový typ a poukazují na tento hlavní seznam.

Bohužel, datové typy vyhledávání musí mít přístup k seznamu zdroj "místně" což znamená, že náš autoritativní seznam nemůže zahrnovat kolekce webů.

Technické řešení:

Zavést nový vlastní datový typ implementována na základě SPField a jako DropDownList v uživatelském rozhraní, jehož položky ListItems naplnit z hlavního seznamu WSS.

Vytvořili jsme novou kolekci webů, které se nazývá "http://localhost/EnterpriseData". Tam, vytvořili jsme vlastní seznam s názvem "Firemní místa". Tento seznam používá standardní titul"" pole obsahující seznam skutečných místech firmy.

Jeden následuje několik samostatných kroků k vytvoření vlastní datový typ v WSS. Jsou to:

  1. Definujte třídu, která dědí z SPField (jeden může zdědit z jiných oborů, dle potřeby).

Zde je kód, který:

veřejné Třída XYZZYCorporateLocationField : SPFieldText
{
veřejné XYZZYCorporateLocationField
(Třídy SPFieldCollection pole, řetězec typeName, řetězec displayName)
: základna(pole, typeName, displayName) { }

veřejné XYZZYCorporateLocationField
(Třídy SPFieldCollection pole, řetězec displayName)
: základna(pole, displayName) { }

veřejné přepsat BaseFieldControl FieldRenderingControl
{
získat
{
BaseFieldControl ovládací prvek = nové XYZZYCorporateLocationFieldControl();
ovládací prvek. Název = to.InternalName;
návrat ovládací prvek;
} //získat
} // fieldrenderingcontrol

veřejné přepsat řetězec GetValidatedString(objekt hodnota)
{
Pokud (to.Požadováno || hodnota. ToString().Rovná se(Řetězec.Prázdný))
{
hod nové SPFieldValidationException ("Oddělení není přiřazeno.");
}
návrat základna.GetValidatedString(hodnota);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definovat další třídu, která dědí z ovládacího prvku základní pole, stejně jako v:

veřejné Třída XYZZYCorporateLocationFieldControl : BaseFieldControl
{
chráněná DropDownList XYZZYCorporateLocationSelector;

chráněná přepsat řetězec DefaultTemplateName
{
získat
{
návrat "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

veřejné přepsat objekt Hodnota
{
získat
{
EnsureChildControls();
návrat to.XYZZYCorporateLocationSelector.SelectedValue;
} // získat
nastavit
{
EnsureChildControls();
to.XYZZYCorporateLocationSelector.SelectedValue = (řetězec)to.ItemFieldValue;
} // nastavit
} // přepsat objekt hodnoty

chráněná přepsat void CreateChildControls()
{

Pokud (to.Pole == null || to.ControlMode == SPControlMode.Displej)
návrat;

základna.CreateChildControls();

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

Pokud (to.XYZZYCorporateLocationSelector == null)
hod nové Výjimka("CHYBA: Nelze načíst. Soubor ASCX!");

Pokud (!to.IsPostBack)
{

použití (SPSite místo = nové SPSite("http://localhost/enterprisedata"))
{
použití (SPWeb webové stránky =. OpenWeb())
{

SPList.Update() currentList = www. Seznamy["Firemní místa"];

foreach (SPItem XYZZYCorporateLocation v currentList.Items)
{
Pokud (XYZZYCorporateLocation["Titul"] == null) «««;

řetězec znázorňující pole název;
znázorňující pole název = XYZZYCorporateLocation["Titul"].ToString();

to.XYZZYCorporateLocationSelector.Items.Add
(nové ListItem(znázorňující pole název, znázorňující pole název));

} // foreach

} // použití webu spweb = site.openweb()
} // pomocí webů spsite = nové spsite("http://localhost/enterprisedata")

} // ne-li zpětné volání

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Výše uvedený kód v podstatě implementuje logiku pro vyplnění DropDownList s hodnotami z vlastního seznamu WSS na http://localhost/enterprisedata a s názvem "podnikové oddělení".

Jsem obě třídy definované v jediné .cs souboru, při kompilaci a dát ji do GAC (silné požadováno, Samozřejmě).

  1. Implementace šablony ovládacího prvku (.ascx) Jak je uvedeno:

<%@ Ovládací prvek Jazyk= "C#" Dědí="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Verze = 12.0.0.0, kultura = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Vždy" %>
<%
@ Registrace Tagprefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Montáž="Microsoft.SharePoint, Verze = 12.0.0.0, Kultura = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrace Tagprefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montáž="Microsoft.SharePoint, Verze = 12.0.0.0, Kultura = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Šablonu vykreslování pro ID= "XYZZYCorporateLocationFieldControl" runat= "server">
<Šablona>
<prostředí ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "server" />
</Šablona>
</
SharePoint:Šablonu vykreslování pro>

Výše uvedené je uložena do c:\Program filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Konečně, vytvoříme soubor XML k uložení do... 12XML adresář. To je CAML, který definuje naše vlastní datový typ a pro můj příklad, Vypadá to, že to:

<?XML verze="1.0" kódování="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Pole Jméno="TypeName">CorporateLocations</Pole>
<
Pole Jméno="ParentType">Text</Pole>
<
Pole Jméno="TypeDisplayName">Firemní místa</Pole>
<
Pole Jméno="TypeShortDescription">Všechna firemní XYZZY umístění včetně výrobní nebo jiné zařízení.</Pole>
<
Pole Jméno="UserCreatable">PRAVDA</Pole>
<
Pole Jméno="ShowInListCreate">PRAVDA</Pole>
<
Pole Jméno="ShowInDocumentLibraryCreate">PRAVDA</Pole>
<
Pole Jméno="ShowInSurveyCreate">PRAVDA</Pole>
<
Pole Jméno="ShowInColumnTemplateCreate">PRAVDA</Pole>
<
Pole Jméno="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Verze = 1.0.0.0, Kultura = neutral, PublicKeyToken = b0b19e85410990c4</Pole>
<
RenderPattern Jméno="DisplayPattern">
<
Spínač>
<
Výraz>
<
Sloupec />
</
Výraz>

<Případ Hodnota=""/>

<Výchozí>
<
HTML>
<![CDATA[
<span style = "color:Červená"><b>]]>
</
HTML>

<
Sloupec SubColumnNumber="0" HTMLEncode="PRAVDA"/>

<HTML><![CDATA[</b></rozpětí>]]></HTML>

</
Výchozí>
</
Spínač>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Tento XML soubor přidá vlastní datový typ WSS "knihovna" a zápasy proti GAC měli shromáždění.

Po přesunutí všech těchto bitů na místo, iisreset na serveru a to by všichni začneme pěkně pracovat.

3 myšlenky na „MECH: Funkční příklad – vlastní datový typ

  1. Alejandro
    Ahoj Paul,
    Nejdřív ze všeho, Díky za článek, protože je to velice zajímavé. Jen jedna otázka;
    Víte, jestli je možné vykreslit správně typ vlastního pole v zobrazení datového listu seznamu?
    Protože každý typ vlastního pole jej vytvořit v zobrazení datového listu se zobrazí jako jen pro čtení (a v síti MSDN, například, moc mi nepomáhá :-S).
    Dík
  2. Lyndsay

    Já jsem se snaží realizovat vaše řešení. Nicméně jsem namísto DropDownList, Mám pouze možnost DropDownChoiceList. Nevíte náhodou jak přidat položky do DropDownChoiceList? Jsme pomocí služby SharePoint 2007 SP1 a Visual Studio 2005 SP1.

Zanech odpověď

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *