Escenario empresarial:
En toda a empresa a implantación de Moss para empresa de construción con 30+ sitios e unha ducia de departamentos corporativos.
Negocios Obxectivo:
A pesar de un gran número de grupos empresariais (departamentos, locais, etc), certos datos debe ser mantida a un nivel mundial. Por exemplo, unha lista mestra autorizada de todos os lugares físicos da empresa (e.g. instalacións de produción, localizacións de almacén, oficinas de vendas) a manter nun lugar central.
Problema Técnico:
A taxonomía empresa implementado empregando varios conxuntos de sitios. Teriamos gusto de crear a lista oficial de lugares físicos nunha lista personalizada WSS. Entón, cando necesitamos ter unha columna nun tipo de contidos (ou unha columna engadida a unha lista ou biblioteca doc) que as empresas locais contidos, we would create a column using the "lookup" tipo de datos e apuntar a esta lista mestra.
Desafortunadamente, lookup datatypes must access a source list "locally" o que significa que a nosa lista oficial non pode abranguer conxuntos de sitios.
Solución Técnica:
Aplicar un novo tipo de datos personalizado aplicado na base SPField e representado como un DropDownList no UI cuxo ListItems cubrir a partir da lista WSS mestre.
Creamos unha nova colección sitio chamado "http://localhost/EnterpriseData". Alí, we created a custom list named "Corporate Locations". This list just uses the standard "Title" campo para conter a lista de lugares corporativos reais.
Un segue varias etapas distintas para crear un tipo de datos personalizado na WSS. Son:
- Definir unha clase que herda de SPField (alguén pode herdar doutros campos, se é necesario).
Aquí está o código para que:
público clase XYZZYCorporateLocationField : SPFieldText
{
público XYZZYCorporateLocationField
(SPFieldCollection campos, corda typeName, corda displayName)
: base(campos, typeName, displayName) { }
público XYZZYCorporateLocationField
(SPFieldCollection campos, corda displayName)
: base(campos, displayName) { }
público substituír BaseFieldControl FieldRenderingControl
{
obter
{
BaseFieldControl control = novo XYZZYCorporateLocationFieldControl();
control.FieldName = este.InternalName;
volver control;
} //obter
} // fieldrenderingcontrol
público substituír corda GetValidatedString(obxecto valor)
{
se (este.Required || value.ToString().Igual(Corda.Baleiro))
{
xogar novo SPFieldValidationException ("Department is not assigned.");
}
volver base.GetValidatedString(valor);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Establecer outra clase que herda o control de campo de base, como no:
público clase XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protexido DropDownList XYZZYCorporateLocationSelector;
protexido substituír corda DefaultTemplateName
{
obter
{
volver "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
público substituír obxecto Valor
{
obter
{
EnsureChildControls();
volver este.XYZZYCorporateLocationSelector.SelectedValue;
} // obter
conxunto
{
EnsureChildControls();
este.XYZZYCorporateLocationSelector.SelectedValue = (corda)este.ItemFieldValue;
} // conxunto
} // override object Value
protexido substituír invalidar CreateChildControls()
{
se (este.Field == nulo || este.ControlMode == SPControlMode.Ver)
volver;
base.CreateChildControls();
este.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");
se (este.XYZZYCorporateLocationSelector == nulo)
xogar novo Excepción("ERROR: Cannot load .ASCX file!");
se (!este.Page.IsPostBack)
{
utilización (SPSite site = novo SPSite("Http://localhost / enterprisedata"))
{
utilización (SPWeb web = site.OpenWeb())
{
SPList currentList = web.Lists["Corporate Locations"];
foreach (SPItem XYZZYCorporateLocation en currentList.Items)
{
se (XYZZYCorporateLocation["Title"] == nulo) continuar;
corda thetitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();
este.XYZZYCorporateLocationSelector.Items.Add
(novo Listitem(thetitle, thetitle));
} // foreach
} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost/enterprisedata")
} // if not a postback
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
O código anterior, basicamente aplica a lóxica para cubrir o DropDownList cos valores da lista personalizada WSS situado na http://localhost/enterprisedata and named "Corporate Departments".
Eu define ambas clases nun arquivo de cs único., compilado-lo e colocar-lo no GAC (forte necesaria, claro).
-
Implementar un modelo de control (.ascx) como se mostra:
<%@ Control Linguaxe="C#" Herda="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%@ Rexistrarse Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Rexistrarse Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="server">
<Modelo>
<áspide:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Modelo>
</SharePoint:RenderingTemplate>
A descrición anterior é gardado en c:\Arquivos de programas Arquivos comúns Microsoft Shared Web Server Extensions 12 CONTROLTEMPLATES.
- Finalmente, creamos un arquivo XML para gardar no ..... 12 directorio XML. Este é CAML que define o noso tipo de datos personalizado e para o meu exemplo, Parece que este:
<?xml versión="1.0" codificación="utf-8" ?>
<FieldTypes>
<FieldType>
<Campo Nome="TypeName">CorporateLocations</Campo>
<Campo Nome="ParentType">Texto</Campo>
<Campo Nome="TypeDisplayName">Corporate Locations</Campo>
<Campo Nome="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Campo>
<Campo Nome="UserCreatable">TRUE</Campo>
<Campo Nome="ShowInListCreate">TRUE</Campo>
<Campo Nome="ShowInDocumentLibraryCreate">TRUE</Campo>
<Campo Nome="ShowInSurveyCreate">TRUE</Campo>
<Campo Nome="ShowInColumnTemplateCreate">TRUE</Campo>
<Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Culture = neutral, PublicKeyToken=b0b19e85410990c4</Campo>
<RenderPattern Nome="DisplayPattern">
<Cambiar>
<Expr>
<Columna />
</Expr>
<No caso de Valor=""/>
<Omisión>
<HTML>
<![CDATA[<span style="color:Red"><b>]]>
</HTML>
<Columna SubColumnNumber="0" HTMLEncode="TRUE"/>
<HTML><![CDATA[</b></van>]]></HTML>
</Omisión>
</Cambiar>
</RenderPattern>
</FieldType>
</FieldTypes>
This XML file adds the custom data type to the WSS "library" e compara-se contra o conxunto GAC'd.
Despois de se cambiar todos eses bits no seu lugar, iisreset no servidor e todo debe comezar a traballar moi ben.
usar System.Web.UI;
usar System.Web.UI.WebControls;
I am attempting to implement your solution. However I instead of DropDownList, I only have the option for a DropDownChoiceList. Do you happen to know how to add items to a DropDownChoiceList? Estamos a usar SharePoint 2007 SP1 e Visual Studio 2005 SP1.