MRu
MRu

Reputation: 1395

Display sharepoint people/group field list's value in people editor

i want to display value of sharepoint people/group value in people editor(web part) when the page is loaded. This is the code that i use to get the value displayed in web part

  if(SPContext .Current .ListItem .ID >= 1)
        using (SPSite site = new SPSite("sitename"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                var id = SPContext.Current.ListItem.ID;
                SPList lists = web.Lists["DDClist"];
                SPListItem item = lists.GetItemById(id);

                {

                    string test = Convert.ToString(item["Project No"]);
                    tb_pno.Text = test;
                    string test2 = Convert.ToString(item["Project Title"]);
                    tb_pname.Text = test2;
                    string test3 = Convert.ToString(item["DDC No"]);
                    tb_idcno.Text = test3;
                    string test4 = Convert.ToString(item["Date In"]);
                    TextBox3.Text = test4;

                }
            }
        }

is there a way to do the same thing with people editor?

Upvotes: 3

Views: 8166

Answers (1)

Rawling
Rawling

Reputation: 50144

This is all a little tricky; when I've had to do it before, I use the following to get SPUser object out of a field:

SPUser singleUser = new SPFieldUserValue(
    item.Web, item["Single User"] as string).User;

SPUser[] multipleUsers = ((SPFieldUserValueCollection)item["MultipleUsers"])
    .Cast<SPFieldUserValue>().Select(f => f.User);

I'm not sure why one user is stored as a string, but multiple users are stored as a specific object; it may also not be consistent in this so you might have to debug a bit and see what the type in your field is.

Once you have these SPUsers, you can populate your PeopleEditor control

using the account names as follows (quite long-winded):

ArrayList entityArrayList = new ArrayList();
foreach(SPUser user in multipleUsers) // or just once for a single user
{
    PickerEntity entity = new PickerEntity;
    entity.Key = user.LoginName;
    entity = peMyPeople.ValidateEntity(entity);
    entityArrayList.Add(entity);
}
peMyPeople.UpdateEntities(entityArrayList);

This also performs validation of the users of some kind.

If the page this control appears on may be posted-back, you need the following to be done during the postback in order for the values to be correctly roundtripped; I put it in PreRender but it could happen elsewhere in the lifecycle:

protected override void OnPreRender(EventArgs e)
{
    if (IsPostBack)
    {
        var csa = peMyPeople.CommaSeparatedAccounts;
        csa = peMyPeople.CommaSeparatedAccounts;
    }
}

If you want to check any error messages that the control generates for you (if the user input is incorrect), you need to have done this switchout already:

var csa = usrBankSponsor.CommaSeparatedAccounts;
csa = usrOtherBankParties.CommaSeparatedAccounts;
//ErrorMessage is incorrect if you haven't done the above
if (!String.IsNullOrEmpty(usrBankSponsor.ErrorMessage))
{
    ...
}

It's really not very nice and there may be a much better way of handling it, but this is the result of my experience so far so hopefully it will save you some time.

Upvotes: 2

Related Questions