Ahora presentaré un pequeño ejemplo de cómo se puede extender el control People Picker, que tanto gusta a los usuarios, pero que en ciertos escenarios (siempre habrá un usuario anormal) no satisface los requerimientos funcionales al cien por ciento, lo que nos llevará irremediablemente a tirar código.
Al final de esta demostración nos daremos cuenta que al extender este control podemos realizar búsquedas sobre diferentes objetos y/o diferentes fuentes de datos, porque este control no está casado con objetos de tipo SPUser como se podría pensar en primera instancia.
Sin más, pasemos al código.Para poder extender la funcionalidad de este control, basicamente tenemos que heredar de tres clases: EntityEditorWithPicker, PickerDialog y SimpleQueryControl.
Dejemos que el código se explique solo :)
001.using System;
002.using System.Collections.Generic;
003.using System.Linq;
004.using System.Text;
005.using Microsoft.SharePoint.WebControls;
006.using System.Collections;
007.using Microsoft.SharePoint;
008.
009.namespace Blog.WebControls
010.{
011.public class CustomPeoplePicker : EntityEditorWithPicker
012.{
013.protected bool m_onInitCalled;
014.protected string m_commaSeparatedAccountsDelayedUntilOnInit;
015.
016.public CustomPeoplePicker()
017.{
018.
019.}
020.
021.protected override void OnInit(EventArgs e)
022.{
023.base.OnInit(e);
024.//definimos el tipo del PickerDialog
025.this.PickerDialogType = typeof(CustomPickerDialog);
026.
027.this.m_onInitCalled = true;
028.
029.if (!string.IsNullOrEmpty(this.m_commaSeparatedAccountsDelayedUntilOnInit))
030.{
031.base.UpdateEntities(this.GetAccountsEntities(this.m_commaSeparatedAccountsDelayedUntilOnInit));
032.this.m_commaSeparatedAccountsDelayedUntilOnInit = null;
033.}
034.}
035.
036./// <summary>
037./// Devuleve la lista de usuarios seleccionados en forma de cadena
038./// </summary>
039./// <param name="picker"> /// <returns></returns>
040.private string GetResolvedEntityAccounts()
041.{
042.if (this.ResolvedEntities == null)
043.{
044.return string.Empty;
045.}
046.if (this.ResolvedEntities.Count == 0)
047.{
048.return string.Empty;
049.}
050.
051.List<string> names = new List<string>();
052.string list = string.Empty;
053.foreach (PickerEntity entity in this.ResolvedEntities.OfType<pickerentity>())
054.{
055.names.Add(entity.Key);
056.}
057.list = string.Join(this.EntitySeparator.ToString(), names.ToArray());
058.return list;
059.}
060.
061.protected ArrayList GetAccountsEntities(string commaSeparatedAccounts)
062.{
063.ArrayList list = new ArrayList();
064.if (commaSeparatedAccounts != null)
065.{
066.foreach (string str in commaSeparatedAccounts.Split(new char[] { this.EntitySeparator }, StringSplitOptions.RemoveEmptyEntries))
067.{
068.string str2 = str.Trim();
069.if (!string.IsNullOrEmpty(str2))
070.{
071.PickerEntity entity = new PickerEntity();
072.entity.Key = str2;
073.list.Add(entity);
074.}
075.}
076.}
077.return list;
078.}
079.
080./// <summary>
081./// Valida las entidades
082./// </summary>
083./// <param name="needsValidation"> /// <returns></returns>
084.public override PickerEntity ValidateEntity(PickerEntity needsValidation)
085.{
086.needsValidation.IsResolved = false; ;
087.
088.CustomQueryControl c = new CustomQueryControl();
089.foreach (CustomUser user in c.GetPeople())
090.{
091.if (needsValidation.Key.Equals(user.EmployeeNumber, StringComparison.InvariantCultureIgnoreCase))
092.{
093.needsValidation.IsResolved = true;
094.}
095.}
096.return needsValidation;
097.}
098.}
099.}
100.</pickerentity></string></string>
01.using System;
02.using System.Collections.Generic;
03.using System.Linq;
04.using System.Text;
05.using Microsoft.SharePoint.WebControls;
06.using System.Collections;
07.
08.namespace Blog.WebControls
09.{
10.public class CustomPickerDialog : PickerDialog
11.{
12.public CustomPickerDialog()
13.: base(new CustomQueryControl(), new TableResultControl(), new CustomPeoplePicker())
14.{
15.ArrayList columnDisplayNames = ((TableResultControl)base.ResultControl).ColumnDisplayNames;
16.columnDisplayNames.Clear();
17.columnDisplayNames.Add("Employee Number");
18.columnDisplayNames.Add("Email");
19.columnDisplayNames.Add("Name");
20.
21.ArrayList columnNames = ((TableResultControl)base.ResultControl).ColumnNames;
22.columnNames.Clear();
23.columnNames.Add("EmployeeNumber");
24.columnNames.Add("Email");
25.columnNames.Add("Name");
26.
27.ArrayList columnWidths = ((TableResultControl)base.ResultControl).ColumnWidths;
28.columnWidths.Clear();
29.columnWidths.Add("20%");
30.columnWidths.Add("30%");
31.columnWidths.Add("50%");
32.}
33.protected override void OnLoad(EventArgs e)
34.{
35.CustomQueryControl control = (CustomQueryControl)this.QueryControl;
36.base.OnLoad(e);
37.}
38.}
39.}
001.using System;
002.using System.Collections.Generic;
003.using System.Linq;
004.using System.Text;
005.using Microsoft.SharePoint.WebControls;
006.using System.Data;
007.
008.namespace Blog.WebControls
009.{
010.public class CustomQueryControl : SimpleQueryControl
011.{
012.public CustomQueryControl()
013.{
014.Load += CustomQueryControl_Load;
015.}
016.
017.void CustomQueryControl_Load(object sender, EventArgs e)
018.{
019.if (!Page.IsPostBack)
020.{
021.EnsureChildControls();
022.mColumnList.Items.Add("EmployeeNumber");
023.mColumnList.Items.Add("Name");
024.mColumnList.Items.Add("Email");
025.}
026.}
027.
028.protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize)
029.{
030.CustomUser[] usersAux = this.GetPeople();
031.if (usersAux == null)
032.return 0;
033.List<customuser> allPeople = new List<customuser>(usersAux);
034.if (allPeople.Count == 0)
035.return 0;
036.
037.List<customuser> searchPeople = new List<customuser>();
038.DataTable resultTable = null;
039.
040.searchPeople = allPeople;
041.
042.if (groupName == "Name" && !string.IsNullOrEmpty(search))
043.{
044.searchPeople = allPeople.Where(x => SearchString.Match(x.Name, search)).ToList();
045.}
046.else if (groupName == "Email" && !string.IsNullOrEmpty(search))
047.{
048.searchPeople = allPeople.Where(x => SearchString.Match(x.Email, search)).ToList();
049.}
050.
051.resultTable = GetPeopleTable(searchPeople.ToArray());
052.
053.PickerDialog.Results = resultTable;
054.PickerDialog.ResultControl.PageSize = resultTable.Rows.Count;
055.
056.return resultTable.Rows.Count;
057.}
058.
059.private DataTable GetPeopleTable(CustomUser[] people)
060.{
061.DataTable dummyTable = new DataTable();
062.dummyTable.Columns.Add("EmployeeNumber");
063.dummyTable.Columns.Add("Name");
064.dummyTable.Columns.Add("Email");
065.
066.foreach (CustomUser person in people)
067.{
068.DataRow row1 = dummyTable.NewRow();
069.row1["Name"] = person.Name;
070.row1["EmployeeNumber"] = person.EmployeeNumber;
071.row1["Email"] = person.Email;
072.dummyTable.Rows.Add(row1);
073.}
074.return dummyTable;
075.}
076.
077.string _excludedUsers;
078.
079.public string ExcludedUsers
080.{
081.get
082.{
083.return this._excludedUsers;
084.}
085.set
086.{
087.this._excludedUsers = value;
088.}
089.}
090.
091.public virtual CustomUser[] GetPeople()
092.{
093.List<customuser> people = new List<customuser>();
094.
095.//agregar toda la logica necesaria para obtener los usuarios
096.people.Add(new CustomUser() { EmployeeNumber = "11111", Email = "juan.topo@contoso.com", Name ="Juan G. Topo" });
097.people.Add(new CustomUser() { EmployeeNumber = "22222", Email = "max.power@contoso.com", Name = "Max Power" });
098.people.Add(new CustomUser() { EmployeeNumber = "33333", Email = "bambi.venado@contoso.com", Name = "Venado Bambi" });
099.people.Add(new CustomUser() { EmployeeNumber = "44444", Email = "homero.simpson@contoso.com", Name = "Homero J. Simpson" });
100.
101.return people.ToArray();
102.}
103.
104.public override PickerEntity GetEntity(DataRow dr)
105.{
106.PickerEntity entity = new PickerEntity();
107.entity.DisplayText = dr["Name"].ToString();
108.entity.Key = dr["EmployeeNumber"].ToString();
109.entity.Description = dr["Email"].ToString();
110.entity.IsResolved = true;
111.return entity;
112.}
113.}
114.}
115.</customuser></customuser></customuser></customuser></customuser></customuser>