Club.CNews: Reports for Silverlight или построитель отчетов c шаблонами и с группировкой
Установка Reports
Библиотека Calabonga.Silverlight.Reports специально упакована в nuget-пакет чтобы можно было с легкостью устанавливать/обновлять/удалять эту библиотеку. Давайте предположим, что Nuget Manager у Вас уже установлен, и тогда можно сразу перейти к установке пакет отчетов. Я создал новый Silverlight-проект чтобы продемонстрировать работу библиотеки. Нажимаем на проекте правую кнопку мыши и запускаем менеджер Nuget:
В открывшемся окне менеджера в поле поиска вбиваем “calabonga” и перед нами все пакеты, которые доступны под брендом “calabonga”:
На данный момент нам потребуется первый в списке “Silverlight Reporting”. А следом за ним я установлю “Samlpe classes and data” чтобы было “что” печать и группировать. Кнопка “Печать” и “Предварительный просмотр”
На главную страницу проекта добавлю две кнопки, а перед этим разобью на области сетку. А также добавлю ContentControl для того чтобы в него поместить предварительный просмотр сформированного отчета перед печатью:
1:
3:
4:
5:
6:
7:
15:
23:
27:
Разметка простая, давай те теперь создадим шаблон. Создаем шаблон печати (ItemTemplate)
Добавлю в проект новый Silverlight UserControl. Пусть называется он Report1.xaml:
Надо добавить namespace для того чтобы Report стал доступен:
xmlns:clb="http://schemas.calabonga.com"
Я во всех своих библиотеках предпочитаю использовать такой namespace, что не приходилось “бегать, искать” что в какой сборке. Вы можете использовать такой же подход в своих сборках. Как сделать “красивый” namespace уже было описано ранее.
Теперь пришло время подготовить данные для печати. Создадим пару-тройку переменных:
1: private List
printData;
2: private Report1 report1;
Теперь вернемся в разметку самого шаблона, надо же к нему как-нибудь обращаться и для этого дадим ему имя, пусть зовут его CalaReport:
1:
3:
4:
5:
6:
7:
8:
А теперь добавим шаблон (ItemTemplate), который будет “рисовать” Person. Если посмотреть в библиотеку SilverlightSampleData, то можно увидеть свойства класса, которые можно отобразить в шаблоне:
Мой шаблон будет такой:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
15:
17:
18:
20:
22:
23:
25:
27:
28:
30:
32:
33:
35:
37:
38:
40:
42:
43:
45:
47:
48:
49:
50:
51:
Обратите внимание на то, как осуществляется привязка – в квадратных скобках. Просто мне кажется “так красивее” :)
И добавим еще и стили, которые использованы в шаблоне для отображения.
1:
2:
4:
6:
8:
10:
11:
13:
15:
17:
19:
21:
22:
Напишем код обработки нажатия кнопок, я приведу весь код, чтобы больше к нему не возвращаться, потому что он не измениться:
1: public partial class MainPage : UserControl
2: {
3: private List
printData;
4: private Report1 report1;
5:
6: public MainPage()
7: {
8: InitializeComponent();
9: Loaded += new RoutedEventHandler(MainPage_Loaded);
10: }
11:
12: void MainPage_Loaded(object sender, RoutedEventArgs e)
13: {
14: report1 = new Report1();
15: printData = People.GetPeople();
16: report1.CalaReport.ItemsSource = printData;
17: }
18:
19: private void print_Click(object sender, RoutedEventArgs e)
20: {
21: report1.CalaReport.Print();
22: }
23:
24: private void preview_Click(object sender, RoutedEventArgs e)
25: {
26: previewBox.Content = report1.CalaReport.GetPreview(previewBox);
27: }
28: }
Ну а теперь, давайте попробуем напечатать. Ура! Что-то видно на превью, да и на принтер что-то улетело… зажужжал гадина:
Надо бы HeaderTemplate и FooterTemplate добавить – для красоты и эстетики:
1:
2:
3:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
18:
20:
21:
23:
25:
26:
28:
30:
31:
33:
35:
36:
38:
40:
41:
43:
45:
46:
48:
50:
51:
52:
53:
и нижняя часть:
1:
2:
3:
6:
7:
8:
9:
Нажимаем печать… И!…
Страница уже выглядит по другому. Про Вас не обращать внимание на шапку, немного кривая вышла, что, кстати, подтверждает чистоту эксперимента. Группировка и Агрегирующие функции
Эта библиотека была изначально задумана как “способная группировать и агрегировать данные при печати. Пришло время проверить на что она способна. Перед тем как добавить группировку надо подключить mscorlib.dll:
1: xmlns:sys="clr-namespace:System;assembly=mscorlib"
Добавим группировку по стране (Country):
1:
2:
3:
4: Country
5:
6:
7:
Определение поля по которому группировать происходит в четвертой строке. Можно добавить сколь угодно параметров группировки (конечно же в разумных пределах). А добавлю-ка я сразу еще и по половому признаку группировку поместив строку:
1: Gender
Между 4 и 5 строками. Теперь раз добавлена группировка следует добавить и шаблоны для группировки (Header и Footer), иначе прилетит ошибка. Шаблон группировки выглядит так:
1:
2:
3:
7:
8:
11:
14:
17:
20:
21:
22:
23:
24:
25:
26:
30:
31:
33:
36:
38:
40:
41:
42:
43:
И, как Вы уже наверное заметили, в шаблонах используются агрегирующие данные. А чтобы они появились следует добавить информацию об агрегации групп:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Компилируем… Запускаем…. Нажимаем предварительный просмотр… И… вуаля:
Шаблоны подготовленные мной конечно оставляют желать лучшего по части эстетического вида, но как бы там не было отчет на бумаге.
Так же хотелось бы добавить, что существуют еще и другие варианты шаблонов. А так же достаточное количество событий.
Надеюсь, что контрол будет востребован. На этом всё. Пишите комментарии.
Библиотека Calabonga.Silverlight.Reports специально упакована в nuget-пакет чтобы можно было с легкостью устанавливать/обновлять/удалять эту библиотеку. Давайте предположим, что Nuget Manager у Вас уже установлен, и тогда можно сразу перейти к установке пакет отчетов. Я создал новый Silverlight-проект чтобы продемонстрировать работу библиотеки. Нажимаем на проекте правую кнопку мыши и запускаем менеджер Nuget:
В открывшемся окне менеджера в поле поиска вбиваем “calabonga” и перед нами все пакеты, которые доступны под брендом “calabonga”:
На данный момент нам потребуется первый в списке “Silverlight Reporting”. А следом за ним я установлю “Samlpe classes and data” чтобы было “что” печать и группировать. Кнопка “Печать” и “Предварительный просмотр”
На главную страницу проекта добавлю две кнопки, а перед этим разобью на области сетку. А также добавлю ContentControl для того чтобы в него поместить предварительный просмотр сформированного отчета перед печатью:
1:
3:
4:
5:
6:
7:
15:
23:
27:
Разметка простая, давай те теперь создадим шаблон. Создаем шаблон печати (ItemTemplate)
Добавлю в проект новый Silverlight UserControl. Пусть называется он Report1.xaml:
Надо добавить namespace для того чтобы Report стал доступен:
xmlns:clb="http://schemas.calabonga.com"
Я во всех своих библиотеках предпочитаю использовать такой namespace, что не приходилось “бегать, искать” что в какой сборке. Вы можете использовать такой же подход в своих сборках. Как сделать “красивый” namespace уже было описано ранее.
Теперь пришло время подготовить данные для печати. Создадим пару-тройку переменных:
1: private List
printData;
2: private Report1 report1;
Теперь вернемся в разметку самого шаблона, надо же к нему как-нибудь обращаться и для этого дадим ему имя, пусть зовут его CalaReport:
1:
3:
4:
5:
6:
7:
8:
А теперь добавим шаблон (ItemTemplate), который будет “рисовать” Person. Если посмотреть в библиотеку SilverlightSampleData, то можно увидеть свойства класса, которые можно отобразить в шаблоне:
Мой шаблон будет такой:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
15:
17:
18:
20:
22:
23:
25:
27:
28:
30:
32:
33:
35:
37:
38:
40:
42:
43:
45:
47:
48:
49:
50:
51:
Обратите внимание на то, как осуществляется привязка – в квадратных скобках. Просто мне кажется “так красивее” :)
И добавим еще и стили, которые использованы в шаблоне для отображения.
1:
2:
4:
6:
8:
10:
11:
13:
15:
17:
19:
21:
22:
Напишем код обработки нажатия кнопок, я приведу весь код, чтобы больше к нему не возвращаться, потому что он не измениться:
1: public partial class MainPage : UserControl
2: {
3: private List
printData;
4: private Report1 report1;
5:
6: public MainPage()
7: {
8: InitializeComponent();
9: Loaded += new RoutedEventHandler(MainPage_Loaded);
10: }
11:
12: void MainPage_Loaded(object sender, RoutedEventArgs e)
13: {
14: report1 = new Report1();
15: printData = People.GetPeople();
16: report1.CalaReport.ItemsSource = printData;
17: }
18:
19: private void print_Click(object sender, RoutedEventArgs e)
20: {
21: report1.CalaReport.Print();
22: }
23:
24: private void preview_Click(object sender, RoutedEventArgs e)
25: {
26: previewBox.Content = report1.CalaReport.GetPreview(previewBox);
27: }
28: }
Ну а теперь, давайте попробуем напечатать. Ура! Что-то видно на превью, да и на принтер что-то улетело… зажужжал гадина:
Надо бы HeaderTemplate и FooterTemplate добавить – для красоты и эстетики:
1:
2:
3:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
18:
20:
21:
23:
25:
26:
28:
30:
31:
33:
35:
36:
38:
40:
41:
43:
45:
46:
48:
50:
51:
52:
53:
и нижняя часть:
1:
2:
3:
6:
7:
8:
9:
Нажимаем печать… И!…
Страница уже выглядит по другому. Про Вас не обращать внимание на шапку, немного кривая вышла, что, кстати, подтверждает чистоту эксперимента. Группировка и Агрегирующие функции
Эта библиотека была изначально задумана как “способная группировать и агрегировать данные при печати. Пришло время проверить на что она способна. Перед тем как добавить группировку надо подключить mscorlib.dll:
1: xmlns:sys="clr-namespace:System;assembly=mscorlib"
Добавим группировку по стране (Country):
1:
2:
3:
4: Country
5:
6:
7:
Определение поля по которому группировать происходит в четвертой строке. Можно добавить сколь угодно параметров группировки (конечно же в разумных пределах). А добавлю-ка я сразу еще и по половому признаку группировку поместив строку:
1: Gender
Между 4 и 5 строками. Теперь раз добавлена группировка следует добавить и шаблоны для группировки (Header и Footer), иначе прилетит ошибка. Шаблон группировки выглядит так:
1:
2:
3:
7:
8:
11:
14:
17:
20:
21:
22:
23:
24:
25:
26:
30:
31:
33:
36:
38:
40:
41:
42:
43:
И, как Вы уже наверное заметили, в шаблонах используются агрегирующие данные. А чтобы они появились следует добавить информацию об агрегации групп:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Компилируем… Запускаем…. Нажимаем предварительный просмотр… И… вуаля:
Шаблоны подготовленные мной конечно оставляют желать лучшего по части эстетического вида, но как бы там не было отчет на бумаге.
Так же хотелось бы добавить, что существуют еще и другие варианты шаблонов. А так же достаточное количество событий.
Надеюсь, что контрол будет востребован. На этом всё. Пишите комментарии.
Ещё новости по теме:
18:20