В этом посте я хочу рассказать как при помощи MS VisualStudio 2010 создать веб-часть - фильтр, на основе данных списка SharePoint, которая выглядит как список переключателей (по сути им и является - radiobuttonlist).
Надеюсь на вашей машинке установлен SP Server (либо Foundation) 2010 и VisualStudio c пакетом SharePointSDK 2010
1. Запускаем VisualStudio от имени администратора
2. Создаем новый пустой проект SharePoint 2010, назовем его RadioButtonListFilter
3. Добавляем новую веб-часть в проект (Add -> New Item -> Web Part), назовем её RadioBtnListFilterWebPart
4. Инициализируем экземпляр RadioButtonList и добавляем необходимый код в CreateChildControl()
private RadioButtonList _radioLstBtn = null;
protected override void CreateChildControls()
{
base.CreateChildControls();
_radioLstBtn = new RadioButtonList();
_radioLstBtn.AutoPostBack = true;
this.Controls.Add(_radioLstBtn);
}
5. Определяем настраиваемые свойства нашей веб-части и пишем их конструкторы:
- Имя списка из которого будем брать значения
private string _sourceListName = null;
[WebBrowsable(true),
Personalizable(PersonalizationScope.User),
WebDescription("SourceListName"),
Category("Параметры фильтра переключателей"),
WebDisplayName("Имя источника (списка) данных")]
public string SourceListName
{
get { return _sourceListName; }
set { _sourceListName = value; }
}
- Имя столбца списка, значения которого будут отображаться в веб-части
private string _displayField = null;
[WebBrowsable(true),
Personalizable(PersonalizationScope.User),
WebDescription("DisplayField"),
Category("Параметры фильтра переключателей"),
WebDisplayName("Поле для отображения")]
public string DisplayField
{
get { return _displayField; }
set { _displayField = value; }
}
- Имя столбца списка, из которого будем выдергивать значения
private string _valueField = null;
[WebBrowsable(true),
Personalizable(PersonalizationScope.User),
WebDescription("ValueField"),
Category("Параметры фильтра переключателей"),
WebDisplayName("Поле значений")]
public string ValueField
{
get { return _valueField; }
set { _valueField = value; }
}
6. Пишем функцию, которая будет заполнять наш radiobuttonlist значениями из списка SharePoint:
Определяем источник значений:
// Источник значений для _radioLstBtn
private SPList _sourceList = null;
private SPList SourceList
{
get
{
if ((_sourceList == null) && (this.SourceListName != null))
{
try
{
_sourceList = SPContext.Current.Web.Lists[SourceListName];
}
catch (SPException ex)
{
// TODO: Insert your custom error handling here
}
}
return _sourceList;
}
}
Пишем функцию LoadData()
private void LoadData()
{
if (this.Page.IsPostBack == false)
{
if ((SourceList != null) && (SourceList.Items != null))
{
for (int i = 0; i < SourceList.Items.Count; i++)
{
SPListItem item = SourceList.Items[i];
ListItem listItem = new ListItem();
if (this.DisplayField != null && this.DisplayField.Length > 0)
{
listItem.Text = item[this.DisplayField].ToString();
}
else
{
listItem.Text = item[0].ToString();
}
if (this.ValueField != null && this.ValueField.Length > 0)
{
listItem.Value = item[this.ValueField].ToString();
}
else
{
listItem.Value = item[0].ToString();
}
_radioLstBtn.Items.Add(listItem);
}
}
}
}
Перегружаем Page.OnLoad()
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
LoadData();
}
Перегружаем OnInit()
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
EnsureChildControls();
}
7. Реализованной на данный момент логики, достаточно для заполнения веб-части данными из списка. Для добавления возможности соединения веб-части с другими веб-частями и передачи параметров фильтра, необходимо реализовать интерфейс ITransformableFilterValues
using System.Collections.ObjectModel;
...
public class RadioBtnListFilterWebPart : WebPart, ITransformableFilterValues
...
public bool AllowAllValue
{
get { return false; }
}
public bool AllowEmptyValue
{
get { return true; }
}
public bool AllowMultipleValues
{
get { return false; }
}
public string ParameterName
{
get
{
if ((this.ValueField != null) && (this.ValueField.Length > 0))
{
return this.ValueField;
}
else
{
return "Unknown";
}
}
}
public ReadOnlyCollection<string> ParameterValues
{
get
{
string selectedValue = String.Empty;
if ((_radioLstBtn != null) && (_radioLstBtn.SelectedItem != null))
{
selectedValue = _radioLstBtn.SelectedItem.Value;
}
string[] values = new string[] { selectedValue };
return new ReadOnlyCollection<string>(values);
}
}
[ConnectionProvider("Отправить значения фильтра", "ITransformableFilterValues", AllowsMultipleConnections = true)]
public ITransformableFilterValues SetConnectionInterface()
{
return this;
}
8. Теперь можно протестировать нашу веб-часть. Деплоим решение на сервер и проверяем. Для возможности проверки у нас должно быть подготовлено два списка, связанных между собой (я создал список стран и городов, в списке городов добавил поле типа «подстановка» с источником записей из стран)
9. На главной странице сайта размещаем веб-часть списка городов и веб-часть созданного фильтра. Заполняем свойства веб-части, применяем изменения и соединяем веб-часть фильтра с веб-частью городов.
Комментариев нет:
Отправить комментарий