Использование в отчетах раскрывающихся блоков (катов)

Удобное представление большого объема информации – важная задача проектирования интерфейса. В этой статье будет описано использование раскрывающихся блоков (катов) с помощью .NET Razor. Более подробно о создании отчетов можно узнать здесь

Для начала работы, на странице Вашего отчета Настройки отображения, в разделе Макет отчета, необходимо выбрать .NET Razor и перейти к вкладке. Откроется пустой лист для разметки. Нет необходимости все делать вручную, на верхней панели находится Мастер шаблона (подробней о использовании мастера можно узнать в справке), с помощью которого будет сгенерирован базовый код макета, который будет выглядеть примерно следующим образом:

Раскрывающиеся блоки (каты)

Скроем некоторую информацию в раскрывающийся блок (кат).

Сперва необходимо подключить пространство имен:

@using EleWise.ELMA.Web.Mvc.Models.Panels

 А затем конструкцию:

@using (Html.CollapsiblePanel(new CollapsiblePanel
				{
					Header = "Подробнее",
					Expanded = false,
					Id = "CommentsFromCollapsiblePanel" + i.ToString(),
					PlusMinus = true,					
					SaveState = false
				}))
				{
					using (Html.ElmaForm())
					{
					}
				}

Между {} будет находиться то, что необходимо скрыть. Внутри можно использовать стандартные html теги, например, <p></p> или <div></div>. В строке Header = "Подробнее" – название раскрывающегося блока. Конструкцию необходимо вставлять внутри цикла @foreach.

Для того, чтобы раскрывающийся блок был у каждой записи необходим счетчик. Нужно объявить переменную непосредственно перед циклом @foreach:

@{int i=0;}

Внутри цикла необходимо увеличивать счетчик: i++;

Целиком код будет выглядеть следующим образом:

 

@using EleWise.ELMA.BPM.Web.Reports.Extensions
@using System.Data
@using EleWise.ELMA.Web.Mvc.Html
@model EleWise.ELMA.BPM.Web.Reports.Models.ReportParametersInfo
@using EleWise.ELMA.Web.Mvc.Models.Panels

@{
    //Получение источника данных по имени
    var data = Model.DataSources["Данные"];
    //Выполнение HQL или SQL запроса, содержащегося внутри источника данных, и получение результата
    DataTable items = data.Get();
}




<style>
.list th {
    background: none repeat scroll 0 0 #666666;
    color: #FFFFFF;
    padding: 5px;
    text-align: left;
}
.list td {
    border-bottom: 1px solid #CCCCCC;
    padding: 3px 5px;
    vertical-align: middle;
}
</style>

  
<div>
<p style="font-size:20px; text-align:center;"></p>

@* Включает постраничное отображение источника данных *@
@(Html.Pager(Model, data))
@* Заголовки колонок отчета. Название колонок берутся из названий столбцов таблицы, содержащей результат выполнение источника данных *@

<table class="list" width="100%" style="margin-top: 10px; font-size: 11px;">
    <tr>
        
        <th scope="col">Наименование</th>
        
    </tr>
@{int i=0;}
    @* Результат выполнения источника данных представляет собой таблицу. Пробегаемся по строкам таблицы и отображаем значение столбцов *@
    @foreach (DataRow row in items.Rows)
    { 
	i++;
        <tr valign="top">
           
            <td >
				@row["Name"]				
				@using (Html.CollapsiblePanel(new CollapsiblePanel
				{
					Header = "Подробнее",
					Expanded = false,
					Id = "CommentsFromCollapsiblePanel" + i.ToString(),
					PlusMinus = true,					
					SaveState = false
				}))
				{
					using (Html.ElmaForm())
					{
						<p>Автор: @Url.EntityLink(row,typeof(EleWise.ELMA.Security.Models.IUser),"AuthorID","UsFullName",true)</p>
						<p>Исполнитель: @Url.EntityLink(row,typeof(EleWise.ELMA.Security.Models.IUser),"Executor","FullName",true)</p>
						<p>Дата завершения: @row["EDate"]</p>
						<p><a href="/Tasks/Task/Execute/@row["Id"].ToString()">Перейти к задаче</a></p>
					}
				}
            </td>
           

        </tr>
	
	
    }
</table>


</div>

А отчет будет выглядеть так:

 

Для более четкого выделения раскрывающегося блока, его можно поместить в теги <div></div> с указанием необходимых параметров.

В качестве примера был добавлен новый стиль для тега <div> в стилях <style></style>:

.brd {
    border: 1px solid #CCCCCC;
    background: #D6E5F3;
    color: black; 
    font-size: 9px;
   }

В итоге код выглядит примерно следующим образом:

<div class="brd">
@using (Html.CollapsiblePanel(new CollapsiblePanel
				{
					Header = "Подробнее",
					Expanded = false,
					Id = "CommentsFromCollapsiblePanel" + i.ToString(),
					PlusMinus = true,					
					SaveState = false
				}))
				{
					using (Html.ElmaForm())
					{
						<p>Автор: @Url.EntityLink(row,typeof(EleWise.ELMA.Security.Models.IUser),"AuthorID","UsFullName",true)</p>
						<p>Исполнитель: @Url.EntityLink(row,typeof(EleWise.ELMA.Security.Models.IUser),"Executor","FullName",true)</p>
						<p>Дата завершения: @row["EDate"]</p>
						<p><a href="/Tasks/Task/Execute/@row["Id"].ToString()">Перейти к задаче</a></p>
					}
				}
</div>

Итоговый вариант отчета с раскрывающимся блоком выглядит следующим образом: