Procedimiento para crear un control personalizado para un formulario
Para personalizar formularios de elementos de lista, se puede extender un control de servidor Windows SharePoint Services predeterminado para definir su propio control personalizado y, a continuación, reemplazar una plantilla de formulario predeterminado existente con una plantilla personalizada que haga referencia a su control personalizado. Puede crear una biblioteca de clases que defina una clase personalizada, copiar el archivo DLL del proyecto en la memoria caché de ensamblados global (GAC) y, a continuación, agregar un archivo .ascx que contenga una definición de plantilla de control personalizado que haga referencia a la DLL para unidad_local:\\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES.
Control ListFieldIterator
El control Microsoft.SharePoint.WebControls.ListFieldIterator se usa para enumerar campos de elementos que deben mostrarse en un formulario. Este control se inserta en formularios de elementos de lista a través de una serie de plantillas de control anidadas que se definen en \CONTROLTEMPLATES\DefaultTemplates.ascx. La plantilla DocumentLibraryForm dispone los controles de la barra de herramientas y los vínculos para el formulario, pero también inserta la plantilla DocumentLibraryFormCore. Esta plantilla, a su vez, inserta un control DocumentLibraryFields. La plantilla predeterminada del control DocumentLibraryFields es FileFormFields, un control que está definido en DefaultTemplates.ascx y que inserta el control ListFieldIterator.
Ejemplo
En el ejemplo siguiente, se define un control del iterador de campo de lista personalizada que extiende la clase ListFieldIterator, reemplazando su método IsFieldExcluded. El ejemplo evita que un campo específico se muestre en los formularios de la biblioteca de documentos a los usuarios que sean miembros de un grupo determinado, a menos que sean administradores de sitios.
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.WebControls
Namespace CustomOverrideControls
Public Class CustomListFieldIterator
Inherits ListFieldIterator
Protected Overrides Function IsFieldExcluded(field As SPField) As Boolean
Dim site As SPWeb = SPContext.Current.Web
Dim groupId As Integer = site.Groups("ExcludeGroup").ID
If site.IsCurrentUserMemberOfGroup(groupId) AndAlso field.Title = "MySpecialColumn" AndAlso site.CurrentUser.IsSiteAdmin = False Then
Return True
End If
Return MyBase.IsFieldExcluded(field)
End Function 'IsFieldExcluded
End Class 'CustomListFieldIterator
End Namespace 'CustomOverrideControls
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace CustomOverrideControls
{
public class CustomListFieldIterator : ListFieldIterator
{
protected override bool IsFieldExcluded(SPField field)
{
SPWeb site = SPContext.Current.Web;
int groupId = site.Groups["ExcludeGroup"].ID;
if (site.IsCurrentUserMemberOfGroup(groupId) && field.Title == "MySpecialColumn" && site.CurrentUser.IsSiteAdmin == false)
{
return true;
}
return base.IsFieldExcluded(field);
}
}
}
Para crear un control personalizado para extender el iterador de campo de lista
En Microsoft Visual Studio 2005, haga clic en Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
En el cuadro de diálogo Nuevo proyecto, seleccione el idioma del proyecto en el cuadro Tipos de proyecto, seleccione Biblioteca de clases en el cuadro Plantilla, escriba un nombre y una ubicación para crear el proyecto, y haga clic en Aceptar.
Para agregar una referencia al ensamblado Microsoft.SharePoint, haga clic con el botón secundario del mouse en el Explorador de soluciones y, en la ficha .NET del cuadro de diálogo Agregar referencia, seleccione Windows SharePoint Services y haga clic en Aceptar.
Para asignar un nombre seguro al ensamblado al crear el proyecto, haga clic con el botón secundario del mouse en Propiedades del Explorador de soluciones, elija Firma, seleccione Firmar el ensamblado y especifique un nombre para el archivo de clave con nombre seguro.
Haga doble clic en el archivo de proyecto .cs o .vb en el Explorador de soluciones y agregue código como en el ejemplo anterior para definir una clase para un control personalizado que extienda un control de Windows SharePoint Services.
Presione CTRL+MAYÚS+B para crear la solución.
En el Explorador de Windows, arrastre la DLL desde la carpeta del proyecto hasta la GAC.
Para implementar un control de formulario personalizado, debe crear un archivo .ascx que contenga una plantilla de control que reemplace una plantilla predeterminada para insertar el control personalizado en la página de formulario.
Ejemplo
En el ejemplo siguiente, se definen tres plantillas personalizadas anidadas para un formulario. La primera plantilla reemplaza la plantilla DocumentLibraryForm para crear una referencia a la segunda plantilla, CustomDocumentLibraryFormCore. Esta plantilla, a su vez, especifica la tercera plantilla, CustomFileFormFields, como la plantilla que lo define para el control DocumentLibraryFields. La tercera plantilla inserta un iterador de campo de lista personalizada que se puede definir en una biblioteca de clases como en el ejemplo anterior.
<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
<Template>
<SharePoint:InformationBar runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator=" " runat="server">
<Template_RightButtons>
<SharePoint:SaveButton TabIndex=1 runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
<SharePoint:FormToolBar runat="server"/>
<SharePoint:FormComponent TemplateName="CustomDocumentLibraryFormCore" runat="server"/>
</Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="CustomDocumentLibraryFormCore" runat="server">
<Template>
<TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 id="formTbl" cellspacing=0 width=100%>
<SharePoint:ChangeContentType runat="server"/>
<SharePoint:DocumentLibraryFields TemplateName="CustomFileFormFields" runat="server"/>
<SharePoint:ApprovalStatus runat="server"/>
</TABLE>
<SharePoint:WebPartPageMaintenanceMessage runat="server"/>
<SharePoint:DocumentTransformersInfo runat="server"/>
<table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline">
<IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt="">
</td></tr></table>
<TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px">
<tr><td width=100%>
<SharePoint:ItemHiddenVersion runat="server"/>
<SharePoint:InitContentType runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator=" " runat="server">
<Template_Buttons>
<SharePoint:CreatedModifiedInfo runat="server"/>
</Template_Buttons>
<Template_RightButtons>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
</td></tr></TABLE>
</Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="CustomFileFormFields" runat="server">
<Template>
<CustomOverrideControls:CustomListFieldIterator runat="server"/>
</Template>
</SharePoint:RenderingTemplate>
Para crear un archivo de plantilla de control personalizado para bibliotecas de documentos
En un editor de texto, cree un archivo .ascx que contenga las directivas necesarias en \12\TEMPLATE\CONTROLTEMPLATES. En el ejemplo anterior, serían necesario directivas como la siguiente para registrar el ensamblado y el espacio de nombres del control personalizado.
<%@ Control Language="C#" %> <%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%> <%@ Register TagPrefix="wssuc" TagName="ToolBar" src="/_controltemplates/ToolBar.ascx" %> <%@ Register TagPrefix="wssuc" TagName="ToolBarButton" src="/_controltemplates/ToolBarButton.ascx" %> <%@Assembly Name="CustomOverrideControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b23bfc50a92c9e0d" %> <%@Register TagPrefix="CustomOverrideControls" Assembly="CustomOverrideControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b23bfc50a92c9e0d" namespace="CustomOverrideControls"%>
Agregue una definición de plantilla al archivo .ascx que reemplace una plantilla de control predeterminada específica, como el ejemplo anterior.
Restablezca Internet Information Services (IIS) para que los cambios surtan efecto.
Para probar el ejemplo anterior, cree un campo a través de la interfaz de usuario cuyo título comience con "z" y vaya a un formulario de un elemento en la biblioteca de documentos para ver los cambios.