Usando el control de búsqueda de usuarios


Cuando en una lista o biblioteca de documentos agregas un campo de tipo “Persona o Grupo”, al momento de editar el elemento verás un control como el que se muestra en la siguiente imagen, al lado de la fila “Cuenta”.

image

Este control cuenta con dos cosas útiles. La primera, cuando escribo algún nombre y hago clic en el primer iconito (el que muestra la palomita), el control valida si lo que escribí pertenece a algún usuario dentro de SharePoint / Directorio Activo. De ser así, lo muestra como tal, y en caso contrario lo marca como inválido.

image

La segunda funcionalidad es que, si no conocemos el nombre del usuario, podemos hacer clic en el segundo iconito (el del libro) y entonces un buscador aparecerá para ayudarnos a elegir alguno.

image

Sobra decir que este control es súmamente útil para buscar gente. Más aún, cuando hacemos algún componente para SharePoint, la gente esperará ver este control cuando tenga que ingresar gente, en lugar de un vil TextBox.

Afortunadamente, el control que hace todas estas monerías está disponible para nosotros en la clase PeopleEditor, ubicado en el espacio de nombres Microsoft.SharePoint.WebControls.

Utilizar esta clase es sencillo. Algunas propiedades son conocidas por nosotros, como AutoPostBack y Width. Otras son fáciles de adivinar: AllowEmpty nos permite determinar si el control debe quedar vacío o no (en caso de que sea false, si no ponemos algo el validador que lleva consigo nos lo hará saber); mientras que MultiSelect nos permite determinar si el control permitirá un solo elemento, o varios (el alto del control varía dependiendo de esto).

He aquí el un código de ejemplo que muestra lo anterior. Es un fragmento de un WebPart creado a guisa de ejemplo, perteneciente al método CreateChildControls.

_singleEditor = new PeopleEditor();
_singleEditor.ID = "_singleEditor";
_singleEditor.AutoPostBack = true;
_singleEditor.Width = new Unit(300, UnitType.Pixel);
_singleEditor.AllowEmpty = false;
_singleEditor.MultiSelect = false;

_multipleEditor = new PeopleEditor();
_multipleEditor.ID = "_multipleEditor";
_multipleEditor.AutoPostBack = true;
_multipleEditor.Width = new Unit(300, UnitType.Pixel);
_multipleEditor.AllowEmpty = true;
_multipleEditor.MultiSelect = true;

Todo más o menos sencillo, ¿no? Bueno, supongamos ahora que queremos pre-cargar nuestros controles con alguna información. Para ello, necesitamos el método UpdateEntities del control. Este método toma como parámetro un ArrayList (lo sé, lo sé, pero recordemos que WSS salió antes que .NET Frameowork 2.0), el cual debe contener cada uno de los usuarios a mostrar en el control. Cada entrada al arreglo debe ser de tipo PickerEntity, con su propiedad Key establecida al nombre del usuario o el de su cuenta. Por ejemplo:

PickerEntity entity = new PickerEntity();
entity.Key = "ASGARD\\freyja";
ArrayList entities = new ArrayList();
entities.Add(entity);
_singleLoadedEditor.UpdateEntities(entities);

En un control cuya propiedad MultiSelect sea true, podemos agregar varios elementos al arreglo. Por ejemplo, el siguiente código obtiene un grupo de SharePoint e itera sobre cada usuario, añadiéndolo al arreglo y por ende, al control PeopleEditor en cuestión.

entities = new ArrayList();
foreach (SPUser user in SPContext.Current.Web.SiteGroups["Asgard Æsir"].Users)
{
    entity = new PickerEntity();
    entity.Key = user.Name;
    entities.Add(entity);
}
_multipleLoadedEditor.UpdateEntities(entities);

¿A poco no gana en la vida? Así es como luce mi WebPart.

image

Chidito, ¿no? ¡Y profesional! Este es el código completo del WebPart mostrado en la imagen anterior.

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.Collections;

namespace Fermasmas.Wordpress.Com.WebParts
{
    public class PeopleEditorExample : WebPart
    {
        private PeopleEditor _singleEditor;
        private PeopleEditor _multipleEditor;
        private PeopleEditor _singleLoadedEditor;
        private PeopleEditor _multipleLoadedEditor;

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            _singleEditor = new PeopleEditor();
            _singleEditor.ID = "_singleEditor";
            _singleEditor.AutoPostBack = true;
            _singleEditor.Width = new Unit(300, UnitType.Pixel);
            _singleEditor.AllowEmpty = false;
            _singleEditor.MultiSelect = false;

            _multipleEditor = new PeopleEditor();
            _multipleEditor.ID = "_multipleEditor";
            _multipleEditor.AutoPostBack = true;
            _multipleEditor.Width = new Unit(300, UnitType.Pixel);
            _multipleEditor.AllowEmpty = true;
            _multipleEditor.MultiSelect = true;

            _singleLoadedEditor = new PeopleEditor();
            _singleLoadedEditor.ID = "_singleLoadedEditor";
            _singleLoadedEditor.AutoPostBack = true;
            _singleLoadedEditor.Width = new Unit(300, UnitType.Pixel);
            _singleLoadedEditor.AllowEmpty = false;
            _singleLoadedEditor.MultiSelect = false;

            _multipleLoadedEditor = new PeopleEditor();
            _multipleLoadedEditor.ID = "_multipleLoadedEditor";
            _multipleLoadedEditor.AutoPostBack = true;
            _multipleLoadedEditor.Width = new Unit(300, UnitType.Pixel);
            _multipleLoadedEditor.AllowEmpty = true;
            _multipleLoadedEditor.MultiSelect = true;

            Controls.Add(new Literal { Text = "Sencillo:<br/>" });
            Controls.Add(_singleEditor);
            Controls.Add(new Literal { Text = "<br/>Sencillo cargado:<br/>" });
            Controls.Add(_singleLoadedEditor);
            Controls.Add(new Literal { Text = "<br/>M&uacute;ltiple:<br/>" });
            Controls.Add(_multipleEditor);
            Controls.Add(new Literal { Text = "<br/>M&uacute;ltiple cargado:<br/>" });
            Controls.Add(_multipleLoadedEditor);

            PickerEntity entity = new PickerEntity();
            entity.Key = "ASGARD\\freyja";
            ArrayList entities = new ArrayList();
            entities.Add(entity);
            _singleLoadedEditor.UpdateEntities(entities);

            SPGroup group = SPContext.Current.Web.SiteGroups["Asgard Æsir"];
            entities = new ArrayList();
            foreach (SPUser user in group.Users)
            {
                entity = new PickerEntity();
                entity.Key = user.Name;
                entities.Add(entity);
            }
            _multipleLoadedEditor.UpdateEntities(entities);
        }
    }
}

Para finalizar, solo comentar una cosa curiosa con la que me topé cuando escribía el ejemplo de este texto: las llamadas a UpdateEntities tienen que hacerse después de agregar los controles al WebPart (es decir, después de hacer el Controls.Add). Si no, el UpdateEntities no reconocerá a los usuarios y presentará un comportamiento extraño. No sé por qué ocurre así, pero lo hace (haz la prueba si gustas). Si alguien sabe la explicación, compártala con el mundo.

¡Buen fin de semana!

  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s