SharePoint MultipleLookupField コントロールの使用方法は?
-
09-06-2019 - |
質問
SharePoint のコンテキストで実行される Web ページで MultipleLookupField コントロールを使用したいと考えています。コントロール 2 ディスプレイ 2 つの SPField コレクションを使用する方法を段階的に示す例を誰かが教えてくれないかと考えていました。
解決
あなたの質問、特に 2 つの SPField コレクションの表示に関する部分を理解できているかどうか完全にはわかりません。これがまったく別の質問に対する答えになってしまったらごめんなさい。
とにかく、Web パーツで MultipleLookupField を使用する簡単なデモ ウォークスルーをここに示します。
チーム サイトを作成します。タスク リストにいくつかのタスクを追加します。また、ドキュメントを共有ドキュメント ライブラリに配置します。共有ドキュメント ライブラリに新しい列を作成します。これを「関連」と呼び、タスク リストのタイトル フィールドへのルックアップにし、複数の値を許可します。
ここで Web パーツを作成し、通常の定型文をすべて実行してから、これを追加します。
Label l;
MultipleLookupField mlf;
protected override void CreateChildControls()
{
base.CreateChildControls();
SPList list = SPContext.Current.Web.Lists["Shared Documents"];
if (list != null && list.Items.Count > 0)
{
LiteralControl lit = new LiteralControl("Associate tasks to " +
list.Items[0].Name);
this.Controls.Add(lit);
mlf = new MultipleLookupField();
mlf.ControlMode = SPControlMode.Edit;
mlf.FieldName = "Related";
mlf.ItemId = list.Items[0].ID;
mlf.ListId = list.ID;
mlf.ID = "Related";
this.Controls.Add(mlf);
Button b = new Button();
b.Text = "Change";
b.Click += new EventHandler(bClick);
this.Controls.Add(b);
l = new Label();
this.Controls.Add(l);
}
}
void bClick(object sender, EventArgs e)
{
l.Text = "";
foreach (SPFieldLookupValue val in (SPFieldLookupValueCollection)mlf.Value)
{
l.Text += val.LookupValue.ToString() + " ";
}
SPListItem listitem = mlf.List.Items[0];
listitem["Related"] = mlf.Value;
listitem.Update();
mlf.Value = listitem["Related"];
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
EnsureChildControls();
}
確かに、これはばかばかしい限りです -- すべてがハードコーディングされており、エラー処理はまったくなく、有用な目的はありません -- しかし、これは簡単なデモとしてのみ使用されます。次に、この Web パーツを構築して展開し、そのインスタンスをチーム サイトのホームページに追加します。これにより、ライブラリ内の最初のドキュメントに関連付けられたタスクを取得および設定できるようになります。
ボタンの末尾にある奇妙な部分である Click ハンドラーでは、mlf.Value から値を読み取り、それを再度書き戻します。これは、UI を実際のリスト値と同期させたい場合に必要であるようです。私の言っている意味を理解するには、bClick の最後の行を省略してみてください。この 1 時間ほど私はこれにイライラしていました。別のコメント投稿者がより良いアプローチを考え出してくれることを願っています...
他のヒント
うーん。私の環境では問題なく動作するので、あなたの設定がどのように異なるのかを調べてみましょう...
コントロールの設定に問題があるようです。私の最初の推測は、コードが通信対象のリストについて非常に多くの仮定を行っているためではないかと思います。次のようなプレーンな標準のチーム サイトがあることを確認できますか (これらの名前では大文字と小文字が区別されると想定しています)。
- いくつかの項目が含まれる「タスク」というリスト
- 少なくとも 1 つのドキュメントを含む Shared Documents というライブラリ
- 共有ドキュメントライブラリの「関連」という列
- 関連列は、タスクのタイトル列へのルックアップ フィールドであり、複数の値を使用できます。
- 共有ドキュメントの最初のドキュメントには、「関連」の値があります。
次に、Web パーツを追加します。成功を祈っている...
うーん。OK、私はまだ自分を壊そうとしています...そこで、layouts ディレクトリに移動して、ファイル foo.aspx を作成しました。ここにあります:
<%@ Page Language="C#" Inherits="System.Web.UI.Page" MasterPageFile="~/_layouts/simple.master" %>
<%@ Register Tagprefix="foo" Namespace="Foople" Assembly="Foople, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"%>
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
<foo:WebPart1 id="fred" runat="server" />
<foo:WebPart1a id="barney" runat="server" />
</asp:Content>
WebPart1 は以前の Web パーツです。WebPart1a はまったく同じコードですが、WebPart ではなく WebControl から直接継承するクラス内にあります。
デバッグする気にならないポストバックのセキュリティ検証の問題を除けば、正常に動作します。
マスターページを ~masterurl/default.master に変更し、foo.aspx を共有ドキュメント ライブラリにアップロードしました。そこからも正常に動作します。WebControl と WebPart は両方とも正しく動作し、セキュリティの問題も解消されました。
それで私は途方に暮れています。このページには、SPFolder.get_ContentTypeOrder() にも含まれる、不明瞭なバグがあることに気付きました。 http://forums.msdn.microsoft.com/en-US/sharepointdevelopment/thread/63baf273-7f36-453e-8293-26417759e2e1/
コードを投稿していただけますか?