Dieser Blog beschreibt wie sie in einer Silverlight Maske eine ComboBox mit den aktuellen Usern einer SiteCollection füllen können. Der konkrete Projekthintergrund war die Vorgabe, in einer Silverlight Maske mehrere Tabellen über eine Maske zu befüllen und dabei auch User Objekte zu schreiben. Dazu muss der Benutzer clientseitig User auswählen können, um diese dann zu schreiben. Die Liste musste also dynamisch zur Laufzeit abgefragt werden.
Vorgehensweise
Als erste muss bekannt sein und dynamisch jederzeit ermittelt werden können, welche User es gibt. Dazu muss die SharePoint Liste Benutzerinformationsliste (people) ausgelesen werden. Zudem müssen die Feldbezeichnungen bekannt sein, aus denen der Name des Users und seine ID hervorgehen. Name und ID werden benötigt, wenn ein neuer Datensatz mit einem User Objekt als Metadatum angelegt werden soll.
Als erstes habe ich die GUID ermitteln und in eine Variable geschrieben.Dazu habe ich über Benutzer und Gruppen die Liste Alle Personen anzeigen lassen. Über Einstellungen erhalte ich in der Adressezeile die GUID dargestellt und kann diese in einer Variablen speichern.
String userGUID = “{776af73a-fdcc-46e7-8337-7ff385a17cde}”;
Als nächste habe ich eine Klasse User definiert und eine Liste, die als Cache für alle eingelesenen User dient. Der Cache ist eine generische Liste.
List<User> ListUser = new List<User>();
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace ItergoDos
{
public class User
{
public string UserSelection { set; get; }
public string ImnName { set; get; }
public string getSPValue()
{
return UserSelection + “,#” + ImnName;
}
}
}
Hier sehen Sie die Properties UserSelection und ImnName, die der Web Service liefert, wenn die Liste abgefragt wird. Die Methode
getSPValue() liefert mir einen String. mit dessen Hilfe ich einen User “schreiben” kann.
Jetzt muss ich die Liste asynchron abrufen und dann in den Cache und in die ComboBox schreiben.
Zunächst der Request:
statusFlag = StatusFlags.USER_AUSLESEN; (das statusFlag wird über eine Enumeration gesetzt.)
GUID = userGUID;
proxy.GetListItemsAsync(GUID, null, null, null, null, null, null);
Im Callback steht die folgende Zeile
void proxy_GetListItemsCompleted(object sender, GetListItemsCompletedEventArgs e)
{
switch (statusFlag)
{
case StatusFlags.START: this.writeGUIDSToCache(e); break;
case StatusFlags.USER_AUSLESEN: populateComboUser(e); break;
}
}
Und so sieht die Methode populateComboUser(e) aus.
private void populateComboUser(GetListItemsCompletedEventArgs e)
{
this.comboUser.Items.Clear();
var dieListe = (from x in e.Result.Elements().First().Elements()
select new User
{
UserSelection = x.Attribute(“ows_UserSelection”).Value,
ImnName = x.Attribute(“ows_ImnName”).Value
}).ToList();
foreach (User u in dieListe)
{
ListUser.Add(u);
this.comboUser.Items.Add(u.ImnName);
}
}
Über Linq lese ich den Result des Request aus schreibe eine Userliste, die in der anschließenden Schleife in den Cache, also die Liste, und in die ComboBox geschrieben wird. In ows_UserSelection steht die ID und in ows_ImnName der Username.
Welche Felder der Web Service liefert habe ich über Fiddler ermittelt indem ich in einem ersten Schritt einfach nur die Liste abgefragt und mir dann das Protokoll angeschaut habe.
Das Ergebnis sieht dann so aus:
