Scripts: различия между версиями
Sidminik (обсуждение | вклад) |
Sidminik (обсуждение | вклад) |
||
| Строка 238: | Строка 238: | ||
==Обращение к данным отчета== | ==Обращение к данным отчета== | ||
*во вкладке кода '''''нельзя использовать квадратные скобки''''' | *во вкладке кода '''''нельзя использовать квадратные скобки''''' (в отличие от выражений) для обращения к данным отчета - вместо этого используется метод <code>GetColumnValue</code> объекта <code>Report</code>, возвращающий значение поля: | ||
<syntaxhighlight lang="C#"> | <syntaxhighlight lang="C#"> | ||
Версия от 04:11, 20 октября 2026
Вкладка Код – содержит программу на языке высокого уровня, которая является частью отчета.
Программа может быть написана на одном из языков .NET:
C#(предпочтительно);VisualBasic.NET(нежелательно).
Область применения вкладки Код довольно обширна - она позволяет:
- выполнить обработку данных, которую невозможно сделать штатными средствами ядра дизайнера;
- управлять печатью страниц отчета и бэндов на странице;
- управлять взаимодействием элементов управления на диалоговых формах;
- управлять формированием динамических объектов
Таблица; - и многое другое.
Чтобы увидеть код отчета, переключитесь на закладку Код в дизайнере:

Язык для вкладки Код настраивается в меню Отчет|Свойства....
Делать это желательно сразу после создания нового отчета, так как при смене языка существующий код очищается.

Общая информация
Вкладка Код в дизайнере содержит только то, что написано вами.
Во вкладке можно
- добавить в главный класс кода свои переменные, методы, свойства;
- создать обработчики событий объектов отчета;
- добавлять новые классы, если это необходимо (класс может быть добавлен как перед главным классом
ReportScript, так и после него.
Во вкладке нельзя
- удалять, переименовывать или изменять область видимости главного класса
ReportScript; - переименовывать пространство имен, в котором находится главный класс.
Порядок действий дизайнера при запуске отчета
- дизайнер добавляет в код список переменных, имена которых совпадают с именами объектов отчета; это делается перед компиляцией кода и позволяет обращаться к объектам отчета по их имени;
- в код добавляются выражения, имеющиеся в отчете, в виде функций;
- выполняется компиляция кода, если главный класс не пустой;
- инициализируются переменные, которые были неявно добавлены в код;
- обработчики событий, определенные в коде, привязываются к объектам отчета;
- запускается отчет.
Обработчики событий
Создание обработчика события

- выбрать интересующее событие и сделать на нем двойной щелчок мышью - дизайнер добавит в код отчета пустой обработчик события:
private void Text2_BeforePrint(object sender, EventArgs e)
{
}
Удаление обработчика события
- выбрать событие в окне
Свойства; - выделить текст имени события и нажамть клавишу
Delete:

События
Каждый объект отчета имеет несколько событий, которым можно назначить обработчик – метод из вкладки кода.
Чтобы максимально гибко управлять отчетом, нужно:
- четко представлять, в какой момент времени вызывается каждое из событий;
- использовать те события, которые соответствуют поставленной задаче.
Пример
Рассмотрим процесс формирования отчета и события, которые при этом генерируются.
В качестве примера возьмем простой отчет, содержащий одну страницу, один бэнд Данные и два объекта Текст на бэнде:

Порядок событий
- В начале отчета вызывается событие
StartReportобъектаОтчет. - Перед формированием страницы вызывается событие страницы
StartPage. Это событие вызывается один раз для каждой страницы шаблона отчета (не путать со страницами готового отчета!). В нашем случае, сколько бы ни было страниц в готовом отчете – событие вызовется один раз, т.к. шаблон отчета состоит из одной страницы. - Затем вызывается событие
CreatePage, которое происходит как раз в тот момент, когда страница создается в подготовленном отчете. - Далее начинается печать строк бэнда
Данные. Происходит это следующим образом:- 4.1 вызывается событие бэнда
BeforePrint; - 4.2 вызываются события
BeforePrintвсех объектов, лежащих на бэнде; - 4.3 все объекты заполняются данными;
- 4.4 вызываются события
AfterDataвсех объектов, лежащих на бэнде; - 4.5 вызывается событие бэнда
BeforeLayout; - 4.6 происходит размещение объектов на бэнде (если среди них есть растягиваемые объекты) и подсчет высоты бэнда и его растягивание (если бэнд растягиваемый);
- 4.7 вызывается событие бэнда
AfterLayout; - 4.8 если бэнд не помещается на свободном месте страницы, формируется новая страница;
- 4.9 бэнд и все его объекты выводятся на страницу готового отчета;
- 4.10 вызывается событие
AfterPrintбэнда; - 4.11 вызывается событие
AfterPrintвсех объектов бэнда.
- 4.1 вызывается событие бэнда
- Печать строк бэнда происходит до тех пор, пока есть данные в источнике.
- После этого формирование отчета в нашем случае завершается и вызываются события
FinishPageстраницы отчета... - ...и наконец – событие
FinishReportобъектаОтчет.
Выводы
- используя события разных объектов, можно контролировать практически каждый момент формирования отчета;
- большинство действий можно выполнить, используя только событие бэнда
BeforePrint– любые изменения, внесенные в объект, будут тут же отображены; - в событии
BeforePrintневозможно анализировать, на какой странице будет напечатан бэнд, если он растягиваемый – ведь подсчет высоты бэнда будет выполнен в пункте4.6; - определить номер страницы для растягиваемого бэнда можно с помощью следующих событий
AfterLayoutв пункте4.7;AfterPrintв пункте4.10(правда, в этом случае бэнд уже будет напечатан и действия над объектами ничего не дадут).
Обращение к объектам .NET
Сборки по умолчанию
Из вкладки кода можно обращаться к любым объектам .NET, которые определены в сборках, подключаемых к новому отчету по умолчанию.
На момент создания описания к ним относятся:
System.dll
System.Xml.dll
System.Data.dll
System.Drawing.dll
System.Drawing.Primitives
FastReport.Compat.dll
FastReport.Forms.WPF.dll
FastReport.DataVisualization.dll
Chemsoft.Triteia.ReportClasses.dll
Chemsoft.Triteia.ReportFunctions.Cells.dll
Chemsoft.Triteia.ReportFunctions.Signatures.dll
Перечень доступных по умолчанию при создании нового отчета сборок может изменяться (чаще - при добавлении нового функционала).
Добавление сборки
Если нужен доступ к другой сборке:
- перейти в свойства отчета
Отчет|Свойства…; - напротив свойства
Скрипт|ReferencedAssemblies|String[] Arrayнажать на кнопку...

- в открывшемся окне
Редактор коллекции строкперейти в конец списка и добавить (с клавиатуры илиВставить) название новой сборки в список сборок отчета:

Использование сборки
После добавления в список сборок отчета ссылки на сборку приложения (.exe или .dll) можно обращаться к функции, используя пространство имени (namespace) вашего приложения.
Пример
Если в приложении определена следующая функция:
namespace Demo
{
public static class MyFunctions
{
public static string Func1()
{
return "Hello!";
}
}
}
Обратиться к ней в скрипте можно так:
string hello = Demo.MyFunctions.Func1();
Если добавить в скрипт директиву using Demo, это позволит укоротить форму обращения к функции:
string hello = MyFunctions.Func1();
Обращение к объектам отчета
Для обращения к объектам отчета (например, объекту Текст) используется имя объекта.
Пример
Следующий пример вернет высоту объекта Text1:
float height = Text1.Height;
Примечание
"Родными" единицами измерения отчета являются экранные пиксели - это необходимо помнить при обращении к таким свойствам объектов, как Left, Top, Width, Height.
Для перевода пикселей в сантиметры и обратно используются константы, определенные в классе Units:
float heightInPixels = Text1.Height;
float heightInCM = heightInPixels / Units.Centimeters;
Text1.Height = Units.Centimeters * 5; // 5см
Обращение к источнику данных
Для обращения к самому источнику данных используйте метод GetDataSource объекта Report:
DataSourceBase ds = Report.GetDataSource("Products");
Как правило, класс DataSourceBase используется в скрипте следующим образом:
// получаем ссылку на источник данных
DataSourceBase ds = Report.GetDataSource("Products");
// инициализируем его
ds.Init();
// перебираем все записи в источнике
while (ds.HasMoreRows)
{
// получаем значение поля для текущей записи источника
string productName = (string)Report.GetColumnValue("Products.Name");
// выполняем с ним какие-то действия...
// ...
// переходим на следующую запись
ds.Next();
}
Обращение к данным отчета
- во вкладке кода нельзя использовать квадратные скобки (в отличие от выражений) для обращения к данным отчета - вместо этого используется метод
GetColumnValueобъектаReport, возвращающий значение поля:
string productName = (string)Report.GetColumnValue("Products.Name");
- имя источника данных и его поля указываются через точку; имя источника может быть составным в случае, если мы обращаемся к источнику данных, используя связь источников данных:
string categoryName = (string)Report.GetColumnValue("Products.Categories.CategoryName");
Примечание
Для облегчения работы можно использовать окно Данные - из него можно перетаскивать элементы данных в скрипт, при этом дизайнер автоматически создает код для обращения к элементу.