В системе имеется возможность добавить колонки в динамически формируемую таблицу, сформировав разметку для нее на стороне сервера. Расширить можно любую DynamicGrid, если у неё задействован метод «ApplyExtensions», такой таблицей, например, является таблица с задачами.
Пример отображения данных в системной таблице с задачами

Рис. 1. Добавление колонки к гриду со списком задач в портлете «Задачи»

Рис. 2. Добавление колонки к гриду со списком задач
Методы расширения (интерфейса)
Точка расширения (интерфейс) IDynamicGridExtension имеет два основных метода:
- bool MatchUniqueName(string uniqueName)– определяет таблицу, для которой предназначено данное расширение, в качестве параметра передается уникальное имя расширения.
- public void Apply<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder) where T : class – определяет действия, которые необходимо произвести для построителя таблицы. В нашем примере добавляются 2 колонки, для каждой из которых формируется разметка.
- Дополнительный метод «public int MaxOrder()» предназначен для задания позиции колонки редактирования. Это необходимо для того, чтобы при добавлении новых колонок в грид в веб-части, колонки с редактированием и удалением записи всегда находились последними.
Пример класса точки расширения
[Component]
public class DynamicGridExtensionAll : IDynamicGridExtension
{
public bool MatchUniqueName(string uniqueName)
{
if (uniqueName == "AllTasks" || uniqueName == "MyTasksPortletGrid") //Будет применено к гридам задач и к гриду в портлете с задачами
return true;
else return false;
}
public void Apply<T>(DynamicGridBuilder<T> builder) where T : class
{
var moduleGridBuilder = GetUid(builder);
var workflowActions = new TaskWorkflowActions();
Func<int> order = MaxOrder;
if (moduleGridBuilder != null) // Применение только к тем объектам, которые указаны в функции GetUid
{
Func<ITask, MvcHtmlString> column = task =>
{
if (task == null || !workflowActions.IsAvailableEdit(TaskBaseManager.Instance.LoadOrNull(task.Id), UserManager.Instance.GetCurrentUser())) //Проверка прав на редактирование задачи
return MvcHtmlString.Empty;
return MvcHtmlString.Create(
String.Format(@"<a href=""{0}"">{1}</a>",
builder.Html.Url().Action("Edit", "Task", new
{
area = "EleWise.ELMA.BPM.Web.Tasks",
id = task.Id
}),
builder.Html.Image("#x16/edit.png", SR.T("Редактировать"))
)
);
};
var lastColumn = builder.Grid.Columns.Count;
builder.Columns(
c => c.Insert(
lastColumn,
m => column(m as ITask)
, columnOrder: order).Width("1%").NotSortable().NotResizable());
}
}
public int MaxOrder()
{
return int.MaxValue;
}
public Guid? GetUid<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder) where T : class
{
if (builder is DynamicGridBuilder<ITaskBase>) return InterfaceActivator.UID<ITaskBase>();
return null;
}
}
Чтобы указать верный uniqueName, необходимо найти в исходных файлах веб-части представление с гридом (обычно имя файла называется Grid.cshtml) и найти метод «ApplyExtensions» (рисунок 4).

Рис. 3. Метод «ApplyExtensions» в представлении с гридом
В данном примере необходимо обратить внимание на функцию GetUid<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder), которая возвращает UID типа ITaskBase, что означает следующее: данное расширение будет применено только к объектам типа ITaskBase.
В методе Apply происходит отрисовка таблицы следующим образом: колонка отрисовывается всегда, но иконка «карандаша» появится только в том случае, если тип задачи соответствует типу ITask (Пользовательская задача-поручение) и у пользователя есть права на редактирование этой задачи.
изменения коснутся не только системной таблицы со списком задач, но и всех остальных таблиц, в которых задействован метод «ApplyExtensions» и в которых есть объекты типа ITaskBase.
Ссылки на элементы API
IDynamicGridExtension
Статья была просмотрена 1283 раз.
Похожие статьи

Структура веб модулей
Добавлено 09 Сентября 2012
Всплывающие подсказки
Добавлено 09 Сентября 2012
Портлеты
Добавлено 19 Сентября 2012