SharePoint のコンテキストで実行される Web ページで MultipleLookupField コントロールを使用したいと考えています。2 つの SPField コレクションを表示するコントロールを使用する方法を段階的に示す例を誰かが手伝ってくれるかどうか疑問に思っていました。
3 に答える
あなたの質問、特に 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 パーツをビルドして展開し、そのインスタンスをチーム サイトのホームページに追加します。ライブラリ内の最初のドキュメントに関連付けられているタスクを取得および設定できるようにする必要があります。
UI を実際のリスト値と同期させたい場合は、ボタンのクリック ハンドラーの最後にある、mlf.Value から値を読み取ってから再度書き戻すという奇妙なビットが必要なようです。bClick の最後の行を省略して、私の言いたいことを確認してみてください。これは過去1時間ほど私を夢中にさせていました。別のコメンターがより良いアプローチを考え出すことを望んでいます...
うーん。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 /
コードを投稿できる可能性はありますか?
うーん。私の場合は問題なく動作するので、セットアップがどのように異なるかを見てみましょう...
コントロールの設定に問題があるようです。私の最初の推測では、これは、コードが話しているリストについて非常に多くの仮定を行っているためです。(これらの名前は大文字と小文字が区別されると仮定します):
- タスクと呼ばれる、いくつかのアイテムを含むリスト
- 少なくとも 1 つのドキュメントを含む共有ドキュメントと呼ばれるライブラリ
- 共有ドキュメント ライブラリの関連という列
- 関連列は、タスクのタイトル列へのルックアップ フィールドであり、複数の値を使用できます。
- 共有ドキュメントの最初のドキュメントには関連の値があります
次に、Web パーツを追加します。成功を祈っている...