MUSGO: Exemplo funcional – tipo de dados personalizados

Cenário de negócios:

Implementação de toda a empresa de musgo para empresa de fabricação com 30+ algumas dúzias de departamentos corporativos e sites.

Objetivo de negócio:

Apesar de uma infinidade de grupos empresariais (departamentos, locais, etc), alguns dados devem ser mantidos a um nível global. Por exemplo, uma lista mestre autoritária de todos os locais físicos da empresa (EG. instalações de fabricação, localizações de armazém, escritórios de vendas) deve ser mantido em um local central.

Problema técnico:

A taxonomia corporativa foi implementada usando vários conjuntos de sites. Gostaríamos que criar a lista autoritária de locais físicos em uma lista personalizada de WSS. Em seguida, quando precisávamos de ter uma coluna em um tipo de conteúdo (ou uma coluna é adicionada a uma biblioteca lista ou doc) que continha locais corporativos, criaríamos uma coluna usando a pesquisa"" DataType e ponto para esta lista mestre.

Infelizmente, tipos de dados de pesquisa devem acessar uma lista de fonte "localmente" significa que nossa lista autoritária não abrangem conjuntos de sites.

Solução técnica:

Implementar um novo tipo de dados personalizados implementado baseado em SPField t: Microsoft.SharePoint.SPField e representado como um DropDownList na interface do usuário cujos ListItems popular da lista mestra de WSS.

Nós criamos um novo conjunto de sites chamado "http://localhost/EnterpriseData". Lá, criamos uma lista personalizada chamada "Corporate locais". Esta lista só usa o padrão "título" campo para conter a lista de locais corporativos reais.

Um segue várias etapas distintas para criar um tipo de dados personalizados no WSS. Eles são:

  1. Definir uma classe que herda de SPField t: Microsoft.SharePoint.SPField (um pode herdar de outros campos, se necessário).

Aqui está o código para que:

público Classe XYZZYCorporateLocationField : SPFieldText
{
público XYZZYCorporateLocationField
(SPFieldCollection campos, Cadeia de caracteres typeName, Cadeia de caracteres displayName)
: base(campos, typeName, displayName) { }

público XYZZYCorporateLocationField
(SPFieldCollection campos, Cadeia de caracteres displayName)
: base(campos, displayName) { }

público substituir BaseFieldControl FieldRenderingControl P:Microsoft.SharePoint.SPField.FieldRenderingControl
{
Obter
{
BaseFieldControl controle = Novo XYZZYCorporateLocationFieldControl();
controle. FieldName = Isso.InternalName;
Voltar controle;
} //Obter
} // FieldRenderingControl p:Microsoft.SharePoint.SPField.FieldRenderingControl

público substituir Cadeia de caracteres GetValidatedString(objeto valor)
{
se (Isso.Necessário || valor. ToString().É igual a(Seqüência de caracteres.Vazio))
{
jogar Novo SPFieldValidationException ("O departamento não está atribuído.");
}
Voltar base.GetValidatedString(valor);
} // GetValidatedString

} // XYZZYCorporateLocation

  1. Definir outra classe que herda do controle de campo base, como em:

público Classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protegido DropDownList XYZZYCorporateLocationSelector;

protegido substituir Cadeia de caracteres DefaultTemplateName
{
Obter
{
Voltar "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

público substituir objeto Valor
{
Obter
{
EnsureChildControls();
Voltar Isso.XYZZYCorporateLocationSelector. SelectedValue;
} // Obter
conjunto
{
EnsureChildControls();
Isso.XYZZYCorporateLocationSelector.SelectedValue = (Cadeia de caracteres)Isso.ItemFieldValue;
} // conjunto
} // substituir o objeto de valor

protegido substituir privatevoid CreateChildControls()
{

se (Isso.Campo = = nulo || Isso.ControlMode = = SPControlMode.Exposição)
Voltar;

base.CreateChildControls();

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

se (Isso.XYZZYCorporateLocationSelector = = nulo)
jogar Novo Exceção("ERRO: Não é possível carregar. Arquivo ASCX!");

se (!Isso.IsPostBack página.)
{

usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite("http://localhost/enterprisedata"))
{
usando (SPWeb Web = site. OpenWeb())
{

SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de["Empresas locais"];

foreach (SPItem XYZZYCorporateLocation em currentList.Items)
{
se (XYZZYCorporateLocation["Título"] == nulo) continuar;

Cadeia de caracteres theTitle;
theTitle = XYZZYCorporateLocation["Título"].ToString();

Isso.XYZZYCorporateLocationSelector.Items.Add
(Novo ListItem(theTitle, theTitle));

} // foreach

} // usando spweb web = site.openweb()
} // usando spsite site = new spsite("http://localhost/enterprisedata")

} // Se não for um postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

O código acima basicamente implementa a lógica para preencher o DropDownList com os valores da lista personalizada do WSS localizado no http://localhost/enterprisedata e nomeado "departamentos corporativos".

Eu defini a ambas as classes em um arquivo único. cs, compilou e colocá-lo no GAC (forte exigido, É claro).

  1. Implementar um modelo de controle (.ascx) como mostrado:

<%@ Controle Língua= "C#" Herda="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versão = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sempre" %>
<%
@ Registre-se TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Montagem="Microsoft.SharePoint, Versão = 12.0.0.0, Cultura = neutro, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registre-se TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montagem="Microsoft.SharePoint, Versão = 12.0.0.0, Cultura = neutro, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "servidor">
<Modelo>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "o servidor" />
</Modelo>
</
SharePoint:RenderingTemplate>

O acima é salvos em c:\programa filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Finalmente, Criamos um arquivo XML para salvar para o... diretório 12XML. Este é o CAML que define o tipo de dados personalizados e para o meu exemplo, se parece com isso:

<?XML Versão="1.0" codificação="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Texto</Campo>
<
Campo Nome="TypeDisplayName">Empresas locais</Campo>
<
Campo Nome="TypeShortDescription">Todos os locais XYZZY corporativa, incluindo instalações de fabricação ou outras.</Campo>
<
Campo Nome="UserCreatable">VERDADE</Campo>
<
Campo Nome="ShowInListCreate">VERDADE</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">VERDADE</Campo>
<
Campo Nome="ShowInSurveyCreate">VERDADE</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">VERDADE</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versão = 1.0.0.0, Cultura = neutro, PublicKeyToken = b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Interruptor>
<
Expr>
<
Coluna />
</
Expr>

<Caso Valor=""/>

<Padrão>
<
HTML>
<![CDATA[
<span style = "color:Vermelho"><b>]]>
</
HTML>

<
Coluna SubColumnNumber="0" HTMLEncode="VERDADE"/>

<HTML><![CDATA[</b></extensão>]]></HTML>

</
Padrão>
</
Interruptor>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Este arquivo XML adiciona o tipo de dados personalizados para o WSS "biblioteca" e corresponde a ele contra o GAC tinha montagem.

Depois de todos esses bits se posicionando, iisreset no servidor e ele deve começar a trabalhar muito bem.

3 pensamentos "MUSGO: Exemplo funcional – tipo de dados personalizados

  1. Alejandro
    Oi Paulo,
    Em primeiro lugar, Obrigado pelo artigo, Porque é muito interessante. Apenas uma pergunta;
    Você sabe se é posible para processar corretamente um personalizado tipo de campo no modo de exibição folha de dados de uma lista?
    Porque cada tipo de campo personalizado criá-lo é mostrado como somente leitura no modo folha de dados (e o MSDN, por exemplo, Não me ajuda muito :-S).
    Obrigado
    Resposta
  2. Delmar

    Estou a tentar implementar a sua solução. No entanto eu em vez de DropDownList, Só tenho a opção para um DropDownChoiceList. Por acaso você sabe como adicionar itens a um DropDownChoiceList? Nós estamos usando o SharePoint 2007 SP1 e Visual Studio 2005 SP1.

    Resposta

Deixar uma resposta

seu endereço de e-mail não será publicado. Campos obrigatórios são marcados *