質問

私のユースケース:

Visual Webパーツを使用してSharePointにイベント管理システムを実装しようとしています。

私は2つのカスタムリストを持っています、1つは "イベント"と呼ばれます。 DisplayForm(It Out-Of-Boxのタイトルフィールド、実際には、他の列の他の非関連の詳細)でイベントの詳細を表示する列 "Title"があるとしましょう。

2番目のリストは「出席者」と呼ばれます。最初に2つの列があります。 "jotentee"(現在のユーザーのloginnameを取得するユーザーフィールド)第二次:「イベント」(現時点:イベントタイトルの文字列)

マイビジュアルWebPart(「イベント」 - リストの表示形式を介して&ToolPaneView= 2を追加しました)次のコードに応じてボタン( "登録"と "unregister")を表示します。

...
using System.Linq;
...
//Snippet of prerequisites for better understanding
SPWeb web = SPContext.Current.Web;
SPUser currentUser = web.CurrentUser;
SPListItem currentEventItem = (SPListItem)SPContext.Current.Item;
string userString = currentUser.ID.ToString() + ";#" + currentUser.LoginName.ToString();
...
//called in page_load
 private void GetButtonView()
    {
        try
        {
            bool foundUsers = (from SPListItem item in tn.Items
                               where item["Attendee"].ToString() == userString
                               && item["Event"].ToString() == currentEventItem.Title
                               select item).Count() > 0;
            if (foundUsers)
            {
                ...
                ButtonRegister.Visible = false;
            }
            else
            {
                ...
                ButtonUnregister.Visible = false;
            }
        }
        catch (Exception ex)
        {
            ...
        }
    }
.

問題このユースケース:イベントリストの後半にイベントタイトル( "title")が変更された場合、私はマッチングのためだけにチェックするためにチェックしたときに正しいマッピング出席者=>イベントを受け取りません。タイトル弦の。

推奨解決策:Atendeesの「イベント」列に、実際のイベント(IDとタイトル、私は思う)を取得し、「出席者」リスト "event" -columnのタイトルを表示します。そのため、「events」-listの後半にタイトルが変更された場合、出席者リストは自動的に "event" -columnでエントリを更新し、 "Register" / "Unregister" - Button(とは別に)確かに必要な正しいマッピングを持つ。)。

誰かが私に解決策/ヒントを与えることができるならば、それを作業するためにそれをプログラム的に行う方法を行う方法を与えることができます。

Dominik

p.S。私はドイツ語ですので、私はあなたが私の質問を理解することを願っています。もっと詳しく尋ねてください。私はそれを適切な英語で説明するために最善を尽くします。

編集1:これも私のとても遠くのaddattendee-methodです:

private void AddAttendee() {
        try
        {
            //Using this because read-permissions are used for attendees
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite ElevatedSite = new SPSite(site.ID))
                {
                    using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb(web.ID))
                    {
                        SPList attendeeList= ElevatedWeb.Lists["Attendees"];
                        SPListItemCollection listItems = attendeeList.Items;
                        SPListItem item = listItems.Add();
                        item["Name"] = currentUser.ID.ToString() + ";#" + 
                        currentUser.LoginName.ToString() + ";#";
                        item["Event"] = currentEventItem["Title"];
                        ElevatedWeb.AllowUnsafeUpdates = true;
                        item.Update();
                        ElevatedWeb.AllowUnsafeUpdates = false;
                        ...
                    }
                }
            });
        }
        catch (Exception ex) 
        {
            ...
        }
    }
.

役に立ちましたか?

解決

As far as I know, changing field type from text to lookup is not supported in Sharepoint.

You should create new lookup field in the Attendees list and point it to Events list, either from Sharepoint list settings, or from code.

Basically, lookup field has the same structure as user field, which you populated in the final bit of your code - ID#;Title. Also, lookup field value is represented by SPFieldLookupValue class, so it can be retrieved like that:

return new SPFieldLookupValue((string)item["EventLookup"]);

You can set lookup field value by assigning new SPFieldLookupValue object to SPListItem property:

item["EventLookup"] = new SPFieldLookupValue(1, "Great Event");

where 1 - Event list item Id and "Great Event" - Event list Item title.

If I also may add some remarks to your code examples. As far as I can see, you are searching attendees for the event by iterating through SPList.Items object and comparing a string value of "Attendee" field with custom string value.

Such a search can return wrong and slow results, because usually user lookup field contains user display name, not a Login Name. I'd recommend using CAML query instead:

SPQuery qry = new SPQuery();
qry.Query =
"  <Where>"
+"    <And>"
+"      <Eq>"
+"          <FieldRef Name='Event' />"
+"          <Value Type='Text'>"+ currentEventItem.Title +"</Value>"
+"      </Eq>"
+"      <Eq>"
+"          <FieldRef Name='Attendee' LookupId='TRUE' />"
+"          <Value Type='Integer'>"+ currentUser.ID.ToString() +"</Value>"
+"      </Eq>"
+"    </And>"
+"  </Where>";
SPListItemCollection listItems = spList.GetItems(qry);
bool foundUsers = listItems.Count > 0;

The query above searches by Event field (type "text" as in your example) and by Attendee user Id without user login Name. Also it retrieves only items, that fall whithin the query where clause.

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top