Веб-часть фильтра переключателей SharePoint 2010


В этом посте я хочу рассказать как при помощи 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. На главной странице сайта размещаем веб-часть списка городов и веб-часть созданного фильтра. Заполняем свойства веб-части, применяем изменения и соединяем веб-часть фильтра с веб-частью городов.


Комментариев нет:

Отправить комментарий