SharePoint 2007. Свой контрол на панели свойств веб-парта
При разработке своих веб-частей для SharePoint'а, зачастую необходимо использовать свои свойства для гибкой и доступной обычным пользователям конфигурации поведения этих веб-частей. Можно конечно использовать стандартный функционал (просто пометить атрибутами свойства веб-части), но результат больно скуден (TextBox для чисел и строк и DropDown для Enum'ов). И здесь на помощь нам приходит следующая хитрость.
Создаем ToolPart для веб-части
Для реализации нам понадобиться сам веб-часть. Условимся, что он уже у нас есть. Также создадим новый класс, который и будет нашим ToolPart'ом. Итак поехали:
В классе веб-части, унаследованного от Microsoft.SharePoint.WebPartPages.WebPart добавляем метод GetToolParts:
public override ToolPart[] GetToolParts()
{
// Создаем коллекция ToolPart'ов и заполняем её необходимыми классами
var toolParts = new List<ToolPart>
{
new ZhukPointToolPart(),
new ZhukPointToolPart("Custom Toolpart 2")
};
// Берем стандартный набор ToolPart'ов
// Если они не нужны - просто убираем строку из метода
var tp = base.GetToolParts();
// К нашим ToolPart'ам добавляем стандартные
// Что к чему добавлять зависит от требования к порядку отрисовки
// Делаем так, чтобы наши ToolPart'ы были вверху
toolParts.AddRange(tp);
// Возвращаем массив классов
return toolParts.ToArray();
}
В примере я добавил в коллекцию ToolPart'ов два одинаковых класса. Сами классы, их количество и порядок роли не играют.
Теперь создадим сам класс ToolPart'а, унаследовав его от Microsoft.SharePoint.WebPartPages.ToolPart:
namespace ZhukPoint.Portal2007.WebControls.ToolParts
{
public sealed class ZhukPointToolPart : ToolPart
{
public ZhukPointToolPart()
: this("Custom ToolPart")
{
}
public ZhukPointToolPart(string titleText)
{
Title = titleText;
}
/// <summary>
/// Наша веб-часть, к которой будет "привязан" ToolPart
/// </summary>
private ZhukPointCustomWebPart WebPart
{
get
{
return WebPartToEdit as ZhukPointCustomWebPart;
}
}
/// <summary>
/// Контрол, который мы будем добавлять в ToolPart
/// </summary>
private DropDownList listSelector;
protected override void CreateChildControls()
{
base.CreateChildControls();
if (WebPart == null) return;
listSelector = new DropDownList();
// Здесь ваша логика
Controls.Add(listSelector);
}
/// <summary>
/// Метод, используемый для сохранения изменений в веб-части
/// </summary>
public override void ApplyChanges()
{
base.ApplyChanges();
if (WebPart == null) return;
// Здесь ваша логика
WebPart.SelectedValue = listSelector.SelectedValue;
}
}
}
Вот и все. Осталось только "прикрутить" вашу логику. Результат будет примерно таким: