3

ページ読み込み時にシェアポイントのピープル/グループの値をピープルエディタ(Webパーツ)に表示したい。これは、Web パーツに表示される値を取得するために使用するコードです

  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;

                }
            }
        }

People Editor で同じことを行う方法はありますか?

4

1 に答える 1

2

これはすべて少し注意が必要です。以前にそれをしなければならなかったとき、私はSPUserフィールドからオブジェクトを取り出すために以下を使用します:

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

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

1人のユーザーが文字列として保存される理由はわかりませんが、複数のユーザーが特定のオブジェクトとして保存されます。また、これでは一貫性がない可能性があるため、少しデバッグして、フィールドのタイプを確認する必要があります。

これらを入手したら、コントロールSPUserにデータを入力できますPeopleEditor

次のようにアカウント名を使用します(かなり長い間):

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);

これは、ある種のユーザーの検証も実行します。

このコントロールが表示されるページがポストバックされる可能性がある場合、値が正しくラウンドトリップされるように、ポストバック中に次のことを行う必要があります。私はそれを入れましたPreRenderが、ライフサイクルの他の場所で発生する可能性があります:

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

コントロールが生成するエラーメッセージを確認する場合(ユーザー入力が正しくない場合)、このスイッチアウトをすでに実行している必要があります。

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

それは本当にあまり良くなく、それを処理するためのはるかに良い方法があるかもしれませんが、これはこれまでの私の経験の結果であるため、時間を節約できることを願っています。

于 2012-12-03T14:16:05.077 に答える