добавить новую страницу
Добрый день, формирую отчет. И в зависимости от параметра, мне надо создать N-ое кол-во страниц. Как программно это реализовать?
Заранее спасибо за ответы.
Заранее спасибо за ответы.
Комментарии
А задача следующая: есть тираж, который разбит на паллеты и необходимо печатать на эти паллеты этикетки.
private void Page1_StartPage(object sender, EventArgs e)
{
int i;
int label = ((Int32)Report.GetParameterValue("NumberOfLabels"));
for(i=1;i<label;i++)
{
Report.Pages.Add(new ReportPage());
}
}
выскакивает ошибка:
В экземпляре объекта не задана ссылка на объект.
System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.
в FastReport.Code.AssemblyDescriptor.InvokeEvent(String name, Object[] parms)
в FastReport.Engine.ReportEngine.RunReportPage(ReportPage page)
в FastReport.Engine.ReportEngine.RunReportPages()
в FastReport.Engine.ReportEngine.RunReportPages(ReportPage page)
в FastReport.Engine.ReportEngine.Run(Boolean runDialogs, Boolean append, Boolean resetDataState, ReportPage page)
в FastReport.Report.Prepare(Boolean append)
в FastReport.Design.ReportTab.Preview()
Если переменной int label = ... указывать явное значение, все ок.
NumberOfLabels - является параметром в репорте, которому присваивается значение из внешнего приложения fr.SetParameterValue("NumberOfLabels",allLabels);.
int label = NumberOfLabels.Value;
то ошибка следующая
Ошибка CS0266: Неявное преобразование типа "object" в "int" невозможно. Существует явное преобразование (отсутствует приведение?)
for(i=1;i<label;i++)
{
Report.Pages.Add(new ReportPage());
}
создается новая чистая страница отчета, а мне надо дублирование с изменение только поля label(номер этикетки)
поясни, что значит что в этом случае такое NumberOfLabels? это какой-то контрол на форме диалога в репорте? или это тот же параметр?
дальше, ошибка выскакивает похоже на присвоении это может быть либо по тому, что ошибся в написании имени параметра , либо параметру не присвоено значение. У меня с вот таким кодом всё норм работает. Это в программе: Это в репорте
Я тебе даже прикреплю исходники, попробуй запустить у себя
А ещё расскажи как ты данные о этикетках в отчёте получаешь. Можно ведь у бэнда (раздела) "Данные" поставить свойство "Формировать новую страницу" и тогда каждая новая запись из источника данных (таблицы например) будет на новом листе.
В общем смотри в программе: Кнопка "Отчёт #1 (новые страницы)" открывает test.frx, куда через параметр "Param" передаётся из программы кол-во листов и в самом отчёте создаются новые страницы.
Кнопка Отчёт #2 (с данными) открывает test2.frx - там я создал источник данных, таблицу с одним столбцом, куда записал значения 1, 2, 3. В секции Данные выставил свойство "Формировать новую страницу", поместил туда текстовое поле и данные в него подставляются из таблицы. Каждая новая запись выводится на новом листе.
PS возьми на заметку удобную фишку - в программе сделано так, что при щелчке мышкой по кнопке, с зажатым контролом на клавиатуре, отчёт открывается в дизайнере. Очень удобно дорабатывать или искать косяки. Что бы открытый в дизайнере отчёт построить, нажимай Ctrl+P (П английское). При этом в нём будут все данные и переданные параметры.
Исходники тут https://yadi.sk/d/BLvwalTXqvaju
Это параметр в репортинге, который принимает значение из внешней программы.
Кол-во этикеток - расчетное. Тираж / кол-во на паллете = кол-во этикеток. И соответственно печатать мы можем все или выбранный диапазон.
Спасибо!
https://drive.google.com/open?id=0B7PCj2TZT...QXl3c0tjNXhsdzA
Проблему так и не решил с передачей значения параметра, переменной
int label = ((Int32)Report.GetParameterValue("NumberOfLabels")); =[А вот полученное значение переменной, не присваивается]!!!!
Смотри, проверяй https://yadi.sk/d/ddBxP6OXqwAHo
На кнопку №1 повесил загрузку твоего файла отчёта.
Пару замечаний сделаю.
1. для красоты переменную i лучше объявлять в самом операторе for Она тогда будет использоваться только в нём и нигде более.
2. что бы получить корректное значение страниц надо либо начинать i с 0 либо условие выполнения цикла делать не меньше, а меньше либо равно
3. В самом отчёте все статичные поля [CustName], [Address], [ItemNameSt] и [ProdId] лучше сделай в бэнде "Заголовок страницы". и можешь в них прямо в дизайнере, а не в коде, прописать значения. Они будут успешно повторяться на всех листах.
Смотри в общем в переделанном файле отчёта
Да, твой отрабатывает без проблем проект, запускаю у себя предварительный просмотр с дизайнера, ничего не меняя, ошибка:
В экземпляре объекта не задана ссылка на объект.
System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.
в FastReport.Code.AssemblyDescriptor.InvokeEvent(String name, Object[] parms)
в FastReport.Engine.ReportEngine.Run(Boolean runDialogs, Boolean append, Boolean resetDataState, ReportPage page)
в FastReport.Report.Prepare(Boolean append)
в FastReport.Design.ReportTab.Preview()
Спасибо за поддержку.
Мне надо массив значений передать в репорт. Например: Создаю на стороне приложения селект и этот набор данных надо принять на стороне репортинга.
Можно конечно в репортинге создать подключение, источник данных. Но это будет затратно для отчетника.
_report.RegisterData();
там куча перегрузок, можешь передать DataSet, DataTable или просто любое перечисление, например List
List listByCode = new List( Types::String ) ;
;
listByCode.addStart( 'Mum' ) ;
listByCode.addEnd( 'washed' ) ;
listByCode.addEnd( 'a' ) ;
listByCode.addEnd( 'frame') ;
fr.RegisterData(listByCode,"ListCode");
Ругается на RegisterData - Аргумент "1" несовместим с требуемым типом.
List<string> listByCode = new List<string>();
listByCode.Add("Mum");
listByCode.Add("washed");
listByCode.Add("a");
listByCode.Add("frame");
_report.RegisterData(listByCode, "ListCode");
List<type> должен быть строго типизированный, с явно указанным типом значений
Как то туплю.
Хорошо, зарегистрировал набор данных(предположим). Дальше в Visual Studio вызов отчета _report.Show();
А в какой момент Visual Studio передает в репортинг значения? Получается, что надо передать еще _report.GetDataSource("ListCode");
А как визуально разместить контролы на форме, если они формируются кодом и в репортинге нет источника и таблиц ?
Всё намного проще Регистрируешь данные RegisterData(), вызываешь дизайнер отчёта _report.Design(); В дизайнере, в менюшке верхней находишь "Выбрать данные для отчёта" и откроется окно, где ты увидишь зарегистрированные твои данные. Это же окно можно вызвать из окна "Данные" (справа, там же где свойства объектов) там кнопочка "Действия" -> "Выбрать данные для отчёта". Поставь галочку рядом с переданным именем источника данных. После этого в этом окне "Данные" ты увидишь свой источник данных, а оттуда поля хоть мышкой перетаскивыай в отчёт.
Не пугайся, там exe файл, но это видюшка
Какой-то только непонятный глюк - когда у тебя List типа string то в отчёте видим не значения элементов, а их длину в символах... а если List<int> передавать то норм, значения видим. напишу в поддержку, пусть разъяснять почему так.
Лучше сделай DataTable, там работает как надо и можешь без проблем несколько столбцов записывать и передавать в отчёт
System.Data.DataSet dataSet;
;
dataSet = new System.Data.DataSet();
dataSet.ReadXml(@c:\Card.xml);
Но мне нужен источник таблиц приложения, разбираюсь
о поводу передачи List<string> в поддержке мне вот что ответили:
Т.е. ты объявляешь свой класс с неким набором полей, потом делаешь список с типом элементов - этот твой класс, и передаёшь в отчёт