Используйте Web Money - это очень удобно

понедельник, 3 марта 2008 г.

Мой фильтр для списка.

Ранее я написал как можно подступисться к внешнему виду listViewИзменение перечня столбцов в ListViewWebPart "на лету".
Хочу более подробно остановиться на использовании фильтра.
Стандартные фильтры неудобны тем, что работают только по равно и только по одному значению. Т.Е. их нужно набирать из веб частей долго настраивать и т.п.
Для тех кто умеет создавать веб части предлагаю пойти другим путем:
Создать свою веб часть фильтрации - поиска в списке.
Итак входящие параметры:
Название списка.
Перечень полей для фильтрации.
Сразу хочу сказать чтов качестве пробы сил реализовал фильтрацию только для строки и даты, но думаю и для других типов это не сложно.
Для каждого текстового поля создаем динамические элементы: Надписи - label, условие - DropDownList - содержит\равно\не равно\начинается с (в соотвествии с возможностями CALM) тексбокс со значением фильтра и DropDownList соединение (и\или)если полей несколько. Можно реализовать любой метод постбека я разместил кнопку.
Для даты создаем надписи и DateTimeControl в моем случае это с значение по значение - поиск в диапазоне.
Далее ищем нашу веб часть по параметру имя списка:

SPList list = SPContext.Current.Web.Lists[_listName];
String guid = "{" + list.ID.ToString().ToUpper() + "}";
ListViewWebPart lv = (ListViewWebPart)wp;
if (lv.ListName == guid)// guid списка (c {})

Читаем xml схему:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.InnerXml = lv.ListViewXml;
XmlNode node;
node = xmlDoc.DocumentElement;

Итак запрос(фильтр) лежит в теге Query.
node["Query"].InnerXml - сюда запишем нашу строку запроса.
Сам запрос легко собирается из значений формы запроса типов полей списка. Самый простой способ - две строки на этапе формирования запроса для простоты в первую часть
тег соединения() + тег запроса
во вторую тег закрытия соединения(/And)).

В конце соединяем строки и записываем xml в веб часть.

4 комментария:

Анонимный комментирует...

Только что написал похожую веб часть, но столкнулся с проблемой: ListViewXml изменяется так как мне надо (проверил в Debug), но ListViewWebPart использует старый XML (скорее всего берет его из ViewState). Пробовал изменять на разных стадиях (Init, Load, Prerender, OnClick) - никакой реакции.
Уважаемый Gleb, не могли бы вы написать к какому событию привязан ваш код? Или может есть какая то процедура (наподобие Update, ApplyChanges) чтобы подтвердить сделанные в веб части изменения?
Андрей

Gleb комментирует...

Переопределенные методы:
protected override void CreateChildControls();
protected override void Render(HtmlTextWriter writer);
Обработка события (нажатия на кнопку применить)
void apply_Click(object sender, EventArgs e)
{
myViewState = this.SaveViewState();
SetQuery();
}
соответсвенно в этом месте и происходит SetQuery(); - метод изменения listviewwebpart.
Т.Е. на onClick. - работает правда только до обращения на сервер.
В другом случае я использовал onInit:
protected override void OnInit(EventArgs e)
{
setWebPart();
base.OnInit(e);
}
и onClick
void myButton_Click(object sender, EventArgs e)
{
setWebPart();
}
Опять же переопределенные методы:
protected override void CreateChildControls();
protected override void Render(HtmlTextWriter writer);

Анонимный комментирует...

Большое спасибо за быстрый ответ. Поместил изменение ListViewXml в OnClick - работает.
Андрей

Анонимный комментирует...

Спасибо огромное. Очень помогло в работе.