Üzleti forgatókönyv:
Vállalati szintű végrehajtására MOSS-gyártó cég 30+ oldalak és néhány tucat vállalati részlegek.
Üzleti cél:
Annak ellenére, hogy számos üzleti csoportok (szervezeti egységek, helyszínek, stb), fenn kell tartani bizonyos adatok globális szinten. Például, egy hiteles mester listája minden fizikai fekvések társaság (pl. gyártó létesítmények, raktárak, értékesítési irodák) fenn kell tartani egy központi helyen.
Technikai probléma:
A vállalati besorolás volt megvalósítva több webhelycsoportot fogjon. Szerettünk volna létrehozni a mérvadó a fizikai helyek WSS egyéni lista. Majd, Ha szükséges, hogy egy oszlop egy tartalomtípusban (vagy egy oszlopot hozzáadni egy listához vagy doc könyvtár) amely tartalmazza a vállalati helyek, mi jönne létre egy oszlop "címkeresés" adattípus és pont ez a fő lista.
Sajnos, Keresés adattípusok kell hozzáférnie a forráslista "helyileg" ami azt jelenti, hogy a hiteles listája nem span webhelycsoportok.
Műszaki megoldás:
Végre egy új egyéni adattípus alapján SPField végre, és képviselteti magát a DropDownList az UI-ban, amelynek elemei feltölti a mester WSS-listából.
Létrehoztunk egy új webhelycsoportot, úgynevezett "http://localhost/EnterpriseData". Ott, hoztuk létre a "Corporate Locations" nevű egyéni lista. Ez a lista csak használ a szabványos "cím" mezőt tartalmaznak, tényleges vállalati helyek listája.
Egyik következik a több diszkrét lépéseket, hogy létrehozzon egy egyedi adattípusú WSS. Ők:
- Egy osztály, amely a SPField örökli meghatározása (lehet örökölni más mezőket szükség esetén).
Itt van a kód:
nyilvános osztály XYZZYCorporateLocationField : SPFieldText
{
nyilvános XYZZYCorporateLocationField
(SPFieldCollection mezők, karakterlánc typeName, karakterlánc a DisplayName attribútum)
: alap(mezők, typeName, a DisplayName attribútum) { }
nyilvános XYZZYCorporateLocationField
(SPFieldCollection mezők, karakterlánc a DisplayName attribútum)
: alap(mezők, a DisplayName attribútum) { }
nyilvános felülbírálása BaseFieldControl FieldRenderingControl
{
kap
{
BaseFieldControl vezérlés = új XYZZYCorporateLocationFieldControl();
vezérlő. Mezőnév = Ez.InternalName;
vissza ellenőrzés;
} //kap
} // fieldrenderingcontrol
nyilvános felülbírálása karakterlánc GetValidatedString(objektum érték)
{
Ha (Ez.Szükséges || érték. ToString().Egyenlő(Karakterlánc.Üres))
{
dobja új SPFieldValidationException ("Osztály nem rendelődik hozzá.");
}
vissza alap.GetValidatedString(érték);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Meghatározni egy olyan másik osztályt a viszonyítási mező vezérlőelem örökli, mint a:
nyilvános osztály XYZZYCorporateLocationFieldControl : BaseFieldControl
{
védett DropDownList XYZZYCorporateLocationSelector;
védett felülbírálása karakterlánc DefaultTemplateName
{
kap
{
vissza "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
nyilvános felülbírálása objektum Érték
{
kap
{
EnsureChildControls();
vissza Ez.XYZZYCorporateLocationSelector.SelectedValue;
} // kap
készlet
{
EnsureChildControls();
Ez.XYZZYCorporateLocationSelector.SelectedValue = (karakterlánc)Ez.ItemFieldValue;
} // készlet
} // felülírja az objektum értéke
védett felülbírálása Érvénytelen CreateChildControls()
{
Ha (Ez.Mező == NULL értékű || Ez.ControlMode tulajdonsága nincs == SPControlMode.Kijelző)
vissza;
alap.CreateChildControls();
Ez.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.("XYZZYCorporateLocationSelector");
Ha (Ez.XYZZYCorporateLocationSelector == NULL értékű)
dobja új Kivétel("HIBA: Nem tölthető be. ASCX fájl!");
Ha (!Ez.IsPostBack oldal.)
{
használatával (SPSite telek = új SPSite("http://localhost/enterprisedata"))
{
használatával (SPWeb Web = site. OpenWeb())
{
Meg az SPList.Update() currentList = webes. Listák["Vállalati helyek"];
foreach (SPItem XYZZYCorporateLocation a currentList.Items)
{
Ha (XYZZYCorporateLocation["A cím"] == NULL értékű) «««;
karakterlánc theTitle;
theTitle = XYZZYCorporateLocation["A cím"].ToString();
Ez.XYZZYCorporateLocationSelector.Items.Add
(új Listaelem(theTitle, theTitle));
} // foreach
} // spweb weben = site.openweb()
} // spsite webhely használatával új spsite =("http://localhost/enterprisedata")
} // Ha nem a postback
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
A fenti kód alapvetően valósítja meg, hogy a logika megtölteni a DropDownList a WSS egyéni listán található értékeket http://localhost/enterprisedata és nevesített "vállalati részlegek".
Én mindkét osztály egy egységes .cs fájlban definiált, összeállított, és tedd be a GAC (erős szükséges, természetesen).
-
Végre egy vezérlőelem-sablon (.ascx) Amint:
<%@ Ellenőrzés Nyelv= "C#" Örököl="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Változat = 12.0.0.0, kultúra = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Mindig" %>
<%@ Regisztráció TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Szerelvény="Microsoft.SharePoint, Változat = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Regisztráció TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Szerelvény="Microsoft.SharePoint, Változat = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate tulajdonságát AZONOSÍTÓ= "XYZZYCorporateLocationFieldControl" runat= "szerver">
<Sablon>
<ASP:DropDownList AZONOSÍTÓ= "XYZZYCorporateLocationSelector" runat= "szerver" />
</Sablon>
</SharePoint:RenderingTemplate tulajdonságát>
A fenti van megtakarított-ba c:\program filescommon filesmicrosoft sharedweb server extensions12controltemplates.
- Végül, Mi teremt egy XML reszelő-hoz megment-ba az... 12XML könyvtár. Ez az CAML, amely meghatározza a mi egyéni adattípus és én például, úgy néz ki, mint ez:
<?XML változat="1.0" kódolás="UTF-8" ?>
<FieldTypes>
<FieldType>
<A mező név="TypeName">CorporateLocations</A mező>
<A mező név="Szülőtípusa">Szöveg</A mező>
<A mező név="TypeDisplayName">Céges helyszínek</A mező>
<A mező név="TypeShortDescription">Minden XYZZY vállalati helyek, beleértve a gyártási, illetve egyéb létesítmények.</A mező>
<A mező név="UserCreatable">IGAZ</A mező>
<A mező név="ShowInListCreate">IGAZ</A mező>
<A mező név="ShowInDocumentLibraryCreate">IGAZ</A mező>
<A mező név="ShowInSurveyCreate">IGAZ</A mező>
<A mező név="ShowInColumnTemplateCreate">IGAZ</A mező>
<A mező név="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Változat = 1.0.0.0, Culture = neutral, PublicKeyToken = b0b19e85410990c4</A mező>
<RenderPattern név="DisplayPattern">
<Kapcsoló>
<A kifejezésben>
<Oszlop />
</A kifejezésben>
<Eset Érték=""/>
<Alapértelmezett>
<HTML>
<![CDATA[<span style = "color:Red"><b>]]>
</HTML>
<Oszlop SubColumnNumber="0" HTMLEncode="IGAZ"/>
<HTML><![CDATA[</b></span>]]></HTML>
</Alapértelmezett>
</Kapcsoló>
</RenderPattern>
</FieldType>
</FieldTypes>
Ez az XML fájl hozzáadja az egyéni adattípus a WSS "könyvtár" és egyezik a GAC ellen volt a közgyűlés.
Miután ezek a bitek a helyére, IISRESET parancsot a szerveren, és ez kell minden elkezd szépen dolgozik.
System.Web.UI használata;
System.Web.UI.WebControls használata;
Én próbál végrehajtani a megoldás. Azonban én nem DropDownList, Már csak a választás részére egy DropDownChoiceList. Tudod, hogyan vehet fel elemeket a DropDownChoiceList véletlenül? Mi használ SharePoint 2007 SP1 és a Visual Studio 2005 SP1.