Всем привет. Сегодня я расскажу о том, как cделать свой собственный "custom lookup picker field with search". Основная цель данной публикации, показать методику создания Custom Field's в SharePoint 2010. Итак приступим:
Часть 1: Реализация
- Создаем проект SharePoint 2010.
- Добавляем SharePoint mapped folder - "XML".
- В папку "XML" добавляем файл - "fldtypes_LookupFieldWithSearch.xml".
<?xml version="1.0" encoding="utf-8" ?> <FieldTypes> <FieldType> <Field Name="Sortable">TRUE</Field> <Field Name="Filterable">TRUE</Field> <Field Name="ParentType">Lookup</Field> <Field Name="UserCreatable">TRUE</Field> <Field Name="InternalType">Lookup</Field> <Field Name="TypeName">LookupFieldWithSearch</Field> <Field Name="TypeDisplayName">Lookup field with search</Field> <Field Name="TypeShortDescription">Lookup field with search</Field> <Field Name="FieldTypeClass">MyProject.CustomFields.LookupFieldWithSearch.LookupFieldWithSearch, $SharePoint.Project.AssemblyFullName$</Field> </FieldType> </FieldTypes>
Листинг 1 - fldtypes_LookupFieldWithSearch.xml.
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace MyProject.CustomFields.LookupFieldWithSearch
{
public class LookupFieldWithSearch : SPFieldLookup
{
public LookupFieldWithSearch(SPFieldCollection fields, string fieldName)
: base(fields, fieldName) { }
public LookupFieldWithSearch(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName) { }
public override BaseFieldControl FieldRenderingControl
{
get
{
BaseFieldControl fieldControl = new LookupFieldWithSearchControl();
fieldControl.FieldName = InternalName;
return fieldControl;
}
}
}
}
Листинг 2 - LookupFieldWithSearch.cs.
- У класса LookupFieldWithSearch перегружаем метод FieldRenderingControl (см. листинг 1).
- Определим класс "LookupFieldWithSearchControl" (см. листинг 3).
using System;
using System.Web;
using System.Text;
using System.Linq;
using System.Collections;
using Microsoft.SharePoint;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
using Microsoft.SharePoint.WebControls;
namespace MyProject.CustomFields.LookupFieldWithSearch
{
public class LookupFieldWithSearchControl : BaseFieldControl
{
#region Конструктор
public LookupFieldWithSearchControl()
: base()
{
}
#endregion
#region Свойства
public SPList LookupList
{
get
{
var web = SPControl.GetContextWeb(base.Context);
var field = Field as LookupFieldWithSearch;
var m_lookupList = web.Lists.GetList(new Guid(field.LookupList), true);
return m_lookupList;
}
}
public override string DisplayTemplateName
{
get
{
if (ControlMode == SPControlMode.Edit || ControlMode == SPControlMode.New)
{
return "LookupFieldWithSearchEditTemplate";
}
else
{
return "LookupFieldWithSearchDisplayTemplate";
}
}
set
{
base.DisplayTemplateName = value;
}
}
protected override string DefaultTemplateName
{
get
{
return DisplayTemplateName;
}
}
public override object Value
{
get
{
if (ControlMode == SPControlMode.New || ControlMode == SPControlMode.Edit)
{
var field = (LookupFieldWithSearch)base.Field;
if (field == null) return null;
var m_displayValue = (TextBox)TemplateContainer.FindControl("m_displayValue");
var m_hiddenValue = (HiddenField)TemplateContainer.FindControl("m_hiddenValue");
var m_hiddenDisplayValue = (HiddenField)TemplateContainer.FindControl("m_hiddenDisplayValue");
if (string.IsNullOrEmpty(m_hiddenValue.Value) || m_hiddenValue.Value.Trim() == string.Empty)
{
return null;
}
else
{
return new SPFieldLookupValue(int.Parse(m_hiddenValue.Value), m_hiddenDisplayValue.Value);
}
}
else
{
return null;
}
}
set
{
if (ControlMode == SPControlMode.New || ControlMode == SPControlMode.Edit)
{
var m_displayValue = (TextBox)TemplateContainer.FindControl("m_displayValue");
var m_hiddenValue = (HiddenField)TemplateContainer.FindControl("m_hiddenValue");
var m_hiddenDisplayValue = (HiddenField)TemplateContainer.FindControl("m_hiddenDisplayValue");
var _value = value as SPFieldLookupValue;
if (_value != null)
{
m_displayValue.Text = m_hiddenDisplayValue.Value = _value.LookupValue;
m_hiddenValue.Value = _value.LookupId.ToString();
}
else
{
m_displayValue.Text = string.Empty;
m_hiddenValue.Value = string.Empty;
m_hiddenDisplayValue.Value = string.Empty;
}
}
}
}
#endregion
#region Методы
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if ((ControlMode == SPControlMode.Edit || ControlMode == SPControlMode.New) && Value == null)
{
var m_hiddenValue = TemplateContainer.FindControl("m_hiddenValue") as HiddenField;
var m_displayValue = TemplateContainer.FindControl("m_displayValue") as TextBox;
var m_hiddenDisplayValue = TemplateContainer.FindControl("m_hiddenDisplayValue") as HiddenField;
m_displayValue.Text = string.Empty;
m_hiddenValue.Value = string.Empty;
m_hiddenDisplayValue.Value = string.Empty;
}
}
protected override void CreateChildControls()
{
base.CreateChildControls();
var field = (LookupFieldWithSearch)Field;
if (field == null) return;
if (ControlMode == SPControlMode.Display)
{
#region Display mode
var item = field.ParentList.GetItemById(SPContext.Current.ItemId);
if (item[field.Id] != null)
{
var m_displayFieldValue = TemplateContainer.FindControl("m_displayFieldValue") as Literal;
var urlToListItem = LookupList.DefaultDisplayFormUrl;
m_displayFieldValue.Text = string.Format("<a href=\"{0}{1}{2}{3}&RootFolder=*\">{4}</a>",
SPContext.Current.Site.Url,
urlToListItem,
"?ID=",
(item[field.Id] as SPFieldLookupValue).LookupId,
(item[field.Id] as SPFieldLookupValue).LookupValue);
}
#endregion
}
if (ControlMode == SPControlMode.Edit || ControlMode == SPControlMode.New)
{
#region New/Edit mode
var m_webUrl = TemplateContainer.FindControl("m_webUrl") as EncodedLiteral;
var m_params = TemplateContainer.FindControl("m_params") as EncodedLiteral;
var m_displayValue = TemplateContainer.FindControl("m_displayValue") as TextBox;
var m_hiddenValue = TemplateContainer.FindControl("m_hiddenValue") as HiddenField;
var m_hiddenDisplayValue = TemplateContainer.FindControl("m_hiddenDisplayValue") as HiddenField;
var m_fieldPrefix1 = TemplateContainer.FindControl("m_fieldPrefix1") as EncodedLiteral;
var m_fieldPrefix2 = TemplateContainer.FindControl("m_fieldPrefix2") as EncodedLiteral;
var m_fieldPrefix3 = TemplateContainer.FindControl("m_fieldPrefix3") as EncodedLiteral;
var m_fieldPrefix4 = TemplateContainer.FindControl("m_fieldPrefix4") as EncodedLiteral;
var m_fieldPrefix5 = TemplateContainer.FindControl("m_fieldPrefix5") as EncodedLiteral;
var m_fieldPrefix6 = TemplateContainer.FindControl("m_fieldPrefix6") as EncodedLiteral;
var m_fieldPrefix7 = TemplateContainer.FindControl("m_fieldPrefix7") as EncodedLiteral;
var m_fieldPrefix8 = TemplateContainer.FindControl("m_fieldPrefix8") as EncodedLiteral;
var m_fieldPrefix9 = TemplateContainer.FindControl("m_fieldPrefix9") as EncodedLiteral;
var m_fieldPrefix10 = TemplateContainer.FindControl("m_fieldPrefix10") as EncodedLiteral;
var m_fieldPrefix11 = TemplateContainer.FindControl("m_fieldPrefix11") as EncodedLiteral;
var m_fieldPrefix12 = TemplateContainer.FindControl("m_fieldPrefix12") as EncodedLiteral;
var m_fieldPrefix13 = TemplateContainer.FindControl("m_fieldPrefix13") as EncodedLiteral;
var m_fieldPrefix14 = TemplateContainer.FindControl("m_fieldPrefix14") as EncodedLiteral;
var m_fieldPrefix15 = TemplateContainer.FindControl("m_fieldPrefix15") as EncodedLiteral;
var m_fieldPrefix16 = TemplateContainer.FindControl("m_fieldPrefix16") as EncodedLiteral;
var m_fieldPrefix17 = TemplateContainer.FindControl("m_fieldPrefix17") as EncodedLiteral;
m_fieldPrefix1.Text = m_fieldPrefix2.Text = m_fieldPrefix3.Text = m_fieldPrefix4.Text = m_fieldPrefix5.Text = m_fieldPrefix6.Text
= m_fieldPrefix7.Text = m_fieldPrefix8.Text = m_fieldPrefix9.Text = m_fieldPrefix10.Text = m_fieldPrefix11.Text = m_fieldPrefix12.Text
= m_fieldPrefix13.Text = m_fieldPrefix14.Text = m_fieldPrefix15.Text = m_fieldPrefix16.Text = m_fieldPrefix17.Text = field.StaticName;
var m_hiddenValueClientID = TemplateContainer.FindControl("m_hiddenValueClientID") as EncodedLiteral;
var m_displayValueClientID = TemplateContainer.FindControl("m_displayValueClientID") as EncodedLiteral;
var m_hiddenDisplayValueClientID = TemplateContainer.FindControl("m_hiddenDisplayValueClientID") as EncodedLiteral;
m_webUrl.Text = SPContext.Current.Web.Url;
m_hiddenValueClientID.Text = m_hiddenValue.ClientID;
m_displayValueClientID.Text = m_displayValue.ClientID;
m_hiddenDisplayValueClientID.Text = m_hiddenDisplayValue.ClientID;
m_params.Text = "?listId=" + field.LookupList;
#endregion
}
}
public override void Validate()
{
base.Validate();
try
{
if ((this.ControlMode == SPControlMode.New || this.ControlMode == SPControlMode.Edit) && this.Field.Required && this.Value == null)
{
this.IsValid = false;
throw new Exception("Необходимо задать значение для этого обязательного поля.");
}
}
catch (Exception ex)
{
this.ErrorMessage = ex.Message;
}
}
#endregion
}
}
Листинг 3 - LookupFieldWithSearchControl.cs.
- Перегрузим свойства DisplayTemplateName и DefaultTemplateName, отвечающих за выбор шаблона во время редактирования/создания/отображения значений поля.
- Добавляем в проект SharePoint mapped folder - "CONTROLTEMPLATES".
- В папке "CONTROLTEMPLATES" - создаем файл "LookupFieldWithSearchTemplate.ascx" (см. листинг 4).
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="pa" Namespace="MyProject.CustomFields.LookupFieldWithSearch" Assembly="$SharePoint.Project.AssemblyFullName$" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" AutoEventWireup="true" %>
<SharePoint:RenderingTemplate ID="LookupFieldWithSearchDisplayTemplate" runat="server">
<Template>
<asp:Literal Mode="PassThrough" runat="server" ID="m_displayFieldValue" />
</Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="LookupFieldWithSearchEditTemplate" runat="server">
<Template>
<script language="javascript" type="text/javascript">
var <SharePoint:EncodedLiteral ID='m_fieldPrefix10' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />webUrl = "<SharePoint:EncodedLiteral ID='m_webUrl' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />"
+ "/_layouts/MyProject/LookupFieldWithSearch/SelectItem.aspx"
+ "<SharePoint:EncodedLiteral ID='m_params' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
var <SharePoint:EncodedLiteral ID='m_fieldPrefix1' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />displayValueClientID = "<SharePoint:EncodedLiteral ID='m_displayValueClientID' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
var <SharePoint:EncodedLiteral ID='m_fieldPrefix2' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenValueClientID = "<SharePoint:EncodedLiteral ID='m_hiddenValueClientID' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
var <SharePoint:EncodedLiteral ID='m_fieldPrefix15' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenDisplayValueClientID = "<SharePoint:EncodedLiteral ID='m_hiddenDisplayValueClientID' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
function <SharePoint:EncodedLiteral ID='m_fieldPrefix9' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />openPickerDialog() {
var options = {
title: 'Выбор',
width: 600,
height: 435,
url: <SharePoint:EncodedLiteral ID='m_fieldPrefix13' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />webUrl,
dialogReturnValueCallback: Function.createDelegate(null, <SharePoint:EncodedLiteral ID='m_fieldPrefix14' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />pickerDialogClosedCallback)
};
SP.UI.ModalDialog.showModalDialog(options);
}
function <SharePoint:EncodedLiteral ID='m_fieldPrefix8' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />pickerDialogClosedCallback(result, value) {
if (result == 1) {
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix3' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenValueClientID).value = value.hiddenValue;
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix4' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />displayValueClientID).value = value.displayValue;
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix17' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenDisplayValueClientID).value = value.displayValue;
}
}
function <SharePoint:EncodedLiteral ID='m_fieldPrefix7' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />clearPicker() {
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix5' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenValueClientID).value = "";
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix6' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />displayValueClientID).value = "";
document.getElementById(<SharePoint:EncodedLiteral ID='m_fieldPrefix16' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />hiddenDisplayValueClientID).value = "";
}
</script>
<table cellpadding="0" cellspacing="0" style="border-style: none; border-collapse: collapse; border-width: 0px; width: 100%;">
<tr>
<td align="left" valign="middle">
<asp:TextBox ID="m_displayValue" runat="server" Enabled="false" />
<asp:HiddenField ID="m_hiddenValue" runat="server" />
<asp:HiddenField ID="m_hiddenDisplayValue" runat="server" />
<img onclick="<SharePoint:EncodedLiteral ID='m_fieldPrefix11' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />openPickerDialog()" alt="Выбрать" src="_layouts/images/MyProject/funnel-pencil.png" style="border-width: 0px; border-style: none; cursor: pointer;" />
<img onclick="<SharePoint:EncodedLiteral ID='m_fieldPrefix12' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />clearPicker()" alt="Очистить" src="_layouts/images/MyProject/cross.png" style="border-width: 0px; border-style: none; cursor: pointer;" />
</td>
</tr>
</table>
</Template>
</SharePoint:RenderingTemplate>
Листинг 4 - LookupFieldWithSearchTemplate.ascx.
- В файле шаблонов (см. листинг 4) определим две области: "LookupFieldWithSearchDisplayTemplate" и "LookupFieldWithSearchEditTemplate".
- В "LookupFieldWithSearchDisplayTemplate" помещаем литерал с Mode="PassThrough" (Mode="PassThrough" нужно для того, чтобы литерал не экранировал html тэги) (см. листинг 4).
- В
"LookupFieldWithSearchEditTemplate" помещаем несколько элементов управления: TextBox, 2 HiddenField и 2 картинки кнопки (см. рис. 1).
Рисунок 1 - Вид LookupFieldWithSearch в режиме редактирования элемента списка.
Наверное вы уже заметили, что в блоке с JavaScript кодом перед каждой переменной стоят литералы, в которые приходят значение статического имени текущего поля - это нужно для того, чтобы javascript обвязки не путались между полями одного и того же типа, в Edit и New форме (избавляемся от дублирующихся переменных). В блоке JavaScript кода (см. листинг 4) есть переменная webUrl (Обязательно получайте значение webUrl с сервера, JS Client Object Model - приходит ссылка на родительский сайт).
- Добавляем SharePoint mapped folder "Images".
- В "Images" создаем папку "MyProject" и в нее помещаем все нужные картинки, которые будет использовать наше поле (фильтр, крест...).
- Добавляем SharePoint mapped folder "Layouts".
- В папке "Layouts" добавляем файл "MyProject\LookupFieldWithSearch\SelectItem.aspx" (Это страница диалога).
- По нажатию на фильтр (см. рис. 1) будет выполняться JavaScript метод openPickerDialog() (см. листинг 4) - открывающий в диалоговом окне страницу "SelectItem.aspx" (см. листинг 5).
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SelectItem.aspx.cs" Inherits="MyProject.Layouts.LookupFieldWithSearch.SelectItem"
MasterPageFile="~/_layouts/dialog.master" %>
<asp:Content ID="DialogHeader" ContentPlaceHolderID="PlaceHolderDialogHeaderSection" runat="server"></asp:Content>
<asp:Content ID="DialogBodyMain" ContentPlaceHolderID="PlaceHolderDialogBodyMainSection" runat="server">
<script type="text/javascript">
var hiddenValueClientID = "<SharePoint:EncodedLiteral ID='m_hiddenValueClientID' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
var displayValueClientID = "<SharePoint:EncodedLiteral ID='m_displayValueClientID' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />";
function commit() {
if (document.getElementById(hiddenValueClientID).value != "") {
window.frameElement.commitPopup(getSelectedItem());
}
else {
alert("<SharePoint:EncodedLiteral ID='m_okError' runat='server' EncodeMethod='EcmaScriptStringLiteralEncode' />");
}
}
function getSelectedItem() {
var item = {
hiddenValue: document.getElementById(hiddenValueClientID).value,
displayValue: document.getElementById(displayValueClientID).value
};
return item;
}
</script>
<style type="text/css">
.searchResults
{
margin-left: 2px;
height: 310px;
width: 99%;
}
.displayValue
{
margin-left: 2px;
width: 99%;
}
.searchTextBox
{
margin-left: 3px;
}
</style>
<table width="570" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-style: none; border-width: 0px; margin: 5px 5px 5px 5px;">
<tr>
<td>
<asp:TextBox ID="m_searchTextBox" runat="server" Width="540px" CssClass="searchTextBox" />
</td>
<td align="center" style="width: 25px; vertical-align: middle;">
<asp:ImageButton ImageUrl="~/_layouts/images/MyProject/magnifier.png" runat="server" OnClick="Search_Click" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:ListBox AutoPostBack="true" ID="m_searchResults" runat="server" CssClass="searchResults" OnSelectedIndexChanged="m_searchResults_SelectedIndexChanged">
</asp:ListBox>
</td>
</tr>
<tr>
<td colspan="2">
<asp:TextBox ID="m_displayValue" CssClass="displayValue" runat="server" Enabled="false" />
<asp:HiddenField ID="m_hiddenValue" runat="server" />
</td>
</tr>
</table>
</asp:Content>
Листинг 5 - SelectItem.aspx.
Обратите внимание, что на странице SelectItem.aspx, MasterPageFile="~/_layouts/dialog.master". Это специализированный MasterPage для диалоговых окон.
Рисунок 2 - Вид диалогового окна.
using System;
using System.Linq;
using System.Web.UI;
using Microsoft.SharePoint;
using PrivateAffairs.Models;
using System.Collections.Generic;
using Microsoft.SharePoint.WebControls;
using MyProject.CustomFields.LookupFieldWithSearch;
namespace MyProject.Layouts.LookupFieldWithSearch
{
public partial class SelectItem : LayoutsPageBase
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
m_hiddenValueClientID.Text = m_hiddenValue.ClientID;
m_displayValueClientID.Text = m_displayValue.ClientID;
((DialogMaster)this.Page.Master).OkButton.OnClientClick = "commit()";
m_okError.Text = "Вы не выбрали элемент!";
}
}
private List<LookupItem> m_foundItems
{
get
{
if (ViewState["m_foundItems"] == null)
{
return null;
}
else
{
return (List<LookupItem>)ViewState["m_foundItems"];
}
}
set
{
ViewState["m_foundItems"] = value;
}
}
protected void Search_Click(object sender, ImageClickEventArgs e)
{
if (m_searchTextBox.Text.Trim() != string.Empty)
{
var query = new SPQuery()
{
Query = string.Format("<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>{0}</Value></Contains></Where>", m_searchTextBox.Text.Trim()),
ViewAttributes = "Scope='Recursive'",
QueryThrottleMode = SPQueryThrottleOption.Override
};
var list = SPContext.Current.Web.Lists.GetList(new Guid(Request.QueryString["listId"]), true);
var items = list.GetItems(query);
if (m_foundItems == null)
m_foundItems = new List<LookupItem>();
m_foundItems.Clear();
foreach (SPListItem item in items)
{
m_foundItems.Add(new LookupItem() { ID = item.ID, Title = item["Title"].ToString() });
}
m_searchResults.DataSource = m_foundItems;
m_searchResults.DataValueField = "ID";
m_searchResults.DataTextField = "Title";
m_searchResults.DataBind();
}
}
protected void m_searchResults_SelectedIndexChanged(object sender, EventArgs e)
{
if (m_searchResults.SelectedValue != null && m_foundItems != null)
{
var item = (from q in m_foundItems where q.ID == int.Parse(m_searchResults.SelectedValue) select q).FirstOrDefault();
if (item != null)
{
m_hiddenValue.Value = item.ID.ToString();
m_displayValue.Text = item.Title;
}
}
}
}
}
Листинг 6 - SelectItem.aspx.cs.
- В методе "PageLoad" страницы "SelectItem.aspx", переопределяем клиентский метод нажатия на OK в диалоговом окне (см. листинг 6).
Я не буду описывать все блоки кода. Код не сложный, и в нем все итак тривиально и понятно. Если будут вопросы, вы можете задать их мне в комментариях к этому посту, и я постараюсь ответить на них.Часть 2: Возможные проблемы и их решения
Проблема: Создал шаблон с Display и Edit представлениями, но после delpoy-я они не появляются.
Решение: SharePoint загружает все ".ascx" файлы c шаблонами, парсит их и получает оттуда массив RenderingTemplate's. В процессе запроса, выбирается нужный RenderingTemplate по ID. Если вы назовете свой edit template например так: "SharePoint:RenderingTemplate ID='EditTemplate'", то ваш шаблон может быть перекрыт другим шаблоном. Поэтому старайтесь выбирать для своего шаблона уникальный ID (можно даже Guid для надежности).Проблема: При открытии диалогового окна вылетает ошибка.
Решение: Все, что открывается в диалоговом окне, должно быть помечено как SafeControl (SelectItem.aspx тоже нужно пометить как SafeControl).
PS. В данном примере не реализована поддержка MultiLookup.

