Как использовать элемент управления SharePoint MultipleLookupField?
-
09-06-2019 - |
Вопрос
Я хочу использовать элемент управления MultipleLookupField на веб-странице, которая будет выполняться в контексте SharePoint.Мне было интересно, не поможет ли мне кто-нибудь с примером, в котором шаг за шагом показано, как использовать элемент управления two для отображения двух коллекций SPField.
Решение
Я не совсем уверен, что понимаю ваш вопрос, особенно в части отображения двух коллекций SPField. Извините, если это окажется ответом на совершенно другой вопрос!
В любом случае, мы рассмотрим краткую демонстрацию использования MultipleLookupField в веб-части.
Создайте сайт группы. Добавьте несколько задач в список задач. Также поместите документ в библиотеку общих документов. Создайте новый столбец в библиотеке общих документов; назовите его «Связанный», пусть он будет «Уточняющим запросом» в поле «Заголовок» списка «Задачи» и разрешит несколько значений.
Теперь создайте веб-часть, выполните все обычные шаблоны и добавьте следующее:
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();
}
Конечно, это нелепо - все жестко запрограммировано, обработка ошибок вообще не предусмотрена, и она не служит никакой полезной цели - но она предназначена только для быстрой демонстрации. Теперь создайте и разверните эту веб-часть и добавьте ее экземпляр на домашнюю страницу сайта своей группы; он должен позволять вам получать и устанавливать задачи, связанные с первым документом в библиотеке.
Странный бит в конце кнопки Обработчик щелчка, где мы читаем значение из mlf.Value и затем записываем его снова, кажется необходимым, если вы хотите, чтобы пользовательский интерфейс синхронизировался с фактическими значениями списка. Попробуйте пропустить последнюю строку bClick, чтобы понять, что я имею в виду. Это сводило меня с ума в течение последнего часа или около того, и я надеюсь, что другой комментатор может предложить лучший подход ...
Другие советы
Хм.На моем все работает нормально, так что давайте посмотрим, сможем ли мы понять, чем отличается ваша настройка...
Похоже, у него возникли проблемы с заполнением элемента управления;моим первым предположением было бы, что это происходит потому, что код делает так много предположений о списках, с которыми он общается.Можете ли вы проверить, что у вас простой сайт ванильной команды с (предположим, что эти имена чувствительны к регистру):
- Список под названием "Задачи", содержащий несколько элементов
- Библиотека под названием " Общие документы", содержащая хотя бы один документ
- Столбец с именем Related в библиотеке общих документов
- Связанный столбец является полем подстановки в столбец Заголовка Задач и допускает несколько значений.
- Первый документ в разделе Общие документы имеет значение для связанных
Затем добавьте веб-часть.Скрестив пальцы...
Хм.Ладно, я все еще пытаюсь сломать свою...поэтому я зашел в каталог 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 - это веб-часть из предыдущих.WebPart1a - это точно такой же код, но в классе, который наследуется непосредственно от WebControl, а не от WebPart.
Это работает нормально, если не считать проблемы с проверкой безопасности при обратной передаче, которую я не могу потрудиться отладить.
Изменив masterpage на ~masterurl/default.master, я загрузил foo.aspx в библиотеку общих документов, и оттуда тоже все работает нормально - и WebControl, и WebPart ведут себя правильно, и проблема безопасности тоже устранена.
Так что я в растерянности.Хотя я заметил на этой странице неясную возможную ошибку, которая также находится в SPFolder.get_ContentTypeOrder(): http://forums.msdn.microsoft.com/en-US/sharepointdevelopment/thread/63baf273-7f36-453e-8293-26417759e2e1/
Есть ли шанс, что вы могли бы опубликовать свой код?