Post on 07-Sep-2020
ReportViewer.
Microsoft Visual Studio 2013 поддерживает функции создания отчетов и элементы управления ReportViewer, которые позволяют добавлять полнофункциональные отчеты в пользовательские приложения. Отчеты могут содержать данные в различных формах, например в виде таблицы. Предоставляемые элементы управления ReportViewer позволяют обрабатывать и отображать отчеты в приложениях. Использовать эти элементы управления можно как в проектах приложений Windows, так и в веб-проектах. Добавить ReportViewer можно на страницу или на форму в приложении из области элементов в разделе Отчёт, а с помощью панели смарт-тегов и свойств можно настроить элемент управления и привязать отчет.
Рис. 1. Окно запущенного приложения с элементом ReportViewer.
Рис. 2. Редактор дизайна формы. Панель смарт-тегов элемента ReportViewer.
Элемент управления ReportViewer отображает только один отчет в любой момент времени. Если нужно просматривать несколько отчетов одновременно, можно использовать несколько экземпляров элемента управления или при помощи кода в одном элементе сменять отчёты, размещая по одному в каждый момент времени.
Простой пример использования.
Создайте новый проект Windows Forms на языке Visual C# с именем TestReportViewer.
Добавьте в решение новый проект (слой) Class Library с именем Business.
Рис. 3. Окно Solution Explorer. Пункт меню добавления нового проекта в решение.
Рис. 4. Окно добавления нового проекта в решение.
В добавленном проекте измените файла класса на BusinessObjects.cs, нажав правой кнопкой на файл и выбрав пункт меню Rename(Переименовать).
Рис. 5. Окно Solution Explorer. Пункт меню Rename(Переименовать).
Замените код этого файла на следующий:
using System;
using System.Collections.Generic;
namespace TestReportViewer.Business
{
public class Product
{
private string m_name;
private int m_price;
public Product(string name, int price)
{
m_name = name;
m_price = price;
}
public string Name
{
get
{
return m_name; }
}
public int Price
{
get
{
return m_price;
}
}
}
public class Merchant
{
private List<Product> m_products;
public Merchant()
{
m_products = new List<Product>();
m_products.Add(new Product("Pen", 25));
m_products.Add(new Product("Pencil", 30));
m_products.Add(new Product("Notebook", 15));
}
public List<Product> GetProducts() {
return m_products;
}
}
}
В главном проекте добавьте ссылку на созданный слой Business, кликнув правой кнопкой по элементу проекта References и выбрав пункт Add Reference. В появившемся окне в разделе Solution(Решение) выберите слой Business.
Рис. 6. Окно Solution Explorer. Пункт меню добавления ссылки в проект.
Рис. 7. Окно Reference Manager. Выбор слоя Business.
Обязательно откомпилируйте решение, чтобы элементу ReportViewer стал доступен созданный класс. Для этого кликните правой кнопкой на название решения и выберите пунктBuild Solution(Построить решение).
Рис. 8. Окно Solution Explorer. Компиляция решения.
Из панели элементов перетащите на форму элемент ReportViewer из раздела Reporting(Отчетность). Откройте панель смарт-тегов и выберите пункт Design a new report (Дизайн нового отчета).
Рис. 9. Редактор дизайна формы. Выбор пункта меню Design a new report (Дизайн новогоотчета).
В появившемся окне выберите тип данных Object(Объект) и нажмите кнопку Next(Следующий).
Рис. 10. Окно Data Source Configuration Wizard. Выбор типа данных Object(Объект).
В слое Business отметьте класс Product для отображения в отчёте и нажмите кнопку Finish(Завершить).
Рис. 11. Окно Data Source Configuration Wizard. Выбор класса Product для отображения вотчёте.
В следующем окне вы увидите добавленные слой Business, класс Product и его открытые свойства Name и Price. Нажмите кнопку Next(Следующий).
Рис. 12. Окно Report Wizard. Добавленные в отчёт классы и их открытые свойства.
Перетащите в Row groups(Группы строк) поле Name, а в группу Values(Значения) поле Price. Уберите флажок с функции Sum и нажмите кнопку Next(Следующий).
Рис. 13. Окно Report Wizard. Настройка групп строк и значений.
Настройте шаблон вывода таблицы по своему усмотрению и нажмите кнопку Next(Следующий).
Рис. 14. Окно Report Wizard. Настройка шаблона вывода таблицы.
Выберите стиль отображения таблицы и нажмите кнопку Finish(Завершить).
Рис. 15. Окно Report Wizard. Выбор стиля отображения таблицы.
В панели смарт-тегов элемента ReportViewer выберите созданный отчёт.
Рис. 16. Редактор дизайна формы. Выбор созданного отчёта в элементе ReportViewer.
В коде формы подключите слой Business, добавив строчку:
using TestReportViewer.Business;
А в обработчике открытия формы замените код на следующий:
private void Form1_Load(object sender, EventArgs e)
{
Merchant m_merchant = new Merchant();
this.ProductBindingSource.DataSource = m_merchant.GetProducts();
this.reportViewer1.RefreshReport();
}
Запустите приложение.
Рис. 17. Запущенное приложение.
Пример создания вложенных отчётов.
Создайте стандартный проект WIS со слоями представление, бизнес, база и предпочтения с именем ReportViewerSubreports. Укажите базе данных имя ReportViewerSubreports и создайте две таблицы: Authors (авторы альбомов - список людей) и Albums (альбомы со ссылками на авторов из первой таблицы). Код определений таблиц базы данных:
Author.cs:using System.ComponentModel.DataAnnotations;
namespace ReportViewerSubreports.DataBase.Definitions
{
public class Author
{
[Key]
public int ID { get; set; }
public bool Flag_Deleted { get; set; } public string Name { get; set; }
public int Age { get; set; }
}
}
Album.cs:using System.ComponentModel.DataAnnotations;
namespace ReportViewerSubreports.DataBase.Definitions
{
public class Album
{
[Key]
public int ID { get; set; } public bool Flag_Deleted { get; set; }
public string Title { get; set; }
public int Price { get; set; }
public int AuthorID { get; set; }
public virtual Author Author { get; set; }
}
}
Код файлов из слоя Business:
Authors.cs:using ReportViewerSubreports.DataBase;
using ReportViewerSubreports.DataBase.Definitions;
using System.Data;
using System.Linq;
namespace ReportViewerSubreports.Business
{
public class Authors
{
Author_oper AuthorsDL;
public Authors()
{
AuthorsDL = new Author_oper();
}
public DataTable GetAuthorsDT() {
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
DataRow dr;
foreach (Author author in AuthorsDL.GetList().ToList())
{
dr = dt.NewRow();
dr["ID"] = author.ID;
dr["Name"] = author.Name;
dr["Age"] = author.Age; dt.Rows.Add(dr);
}
return dt;
}
}
}
Albums.cs:using ReportViewerSubreports.DataBase;
using ReportViewerSubreports.DataBase.Definitions;
using System.Data;
using System.Linq;
namespace ReportViewerSubreports.Business
{
public class Albums
{
Album_oper AlbumsDL;
public Albums()
{
AlbumsDL = new Album_oper();
}
public DataTable GetAlbumsDT() {
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("AuthorID", typeof(int));
DataRow dr;
foreach (Album album in AlbumsDL.GetList().ToList())
{
dr = dt.NewRow(); dr["ID"] = album.ID;
dr["Title"] = album.Title;
dr["Price"] = album.Price;
dr["AuthorID"] = album.AuthorID;
dt.Rows.Add(dr);
}
return dt;
}
}
}
Рис. 18. Окно Solution Explorer. Структура созданного проекта.
Откомпилируйте и запустите проект. Любым способом проверьте работоспособность базы, на сервере должна создаться база с именем ReportViewerSubreports. Добавьте в обе таблицылюбые демо данные.
К основному проекту добавьте два отчёта с именами Report_Authors.rdlc (отчёт по авторам)и Report_Albums.rdlc (отчёт по альбомам).
Рис. 19. Окно Add New Item добавления нового элемента в проект.
В редакторе откройте файл отчёта по авторам Report_Authors. Откройте окно Report Data, если оно ещё не открыто, выбрав в главном верхнем меню пункт View – Report Data. В этом окне кликните правой кнопкой по пункту Datasets (наборы данных) и выберите пункт меню Add Dataset (добавить набор данных).
Рис. 20. Окно Report Data. Команда добавления набора данных.
Выберите тип данных Database (из базы данных) и нажмите кнопку Next(Следующий).
Рис. 21. Окно Data Source Configuration Wizard. Выбор типа данных набора.
Выберите тип модели базы данных Dataset (множество данных) и нажмите кнопку Next(Следующий).
Рис. 22. Окно Data Source Configuration Wizard. Выбор типа модели базы данных.
Нажмите кнопку New Connection (Новое соединение).
Рис. 23. Окно Data Source Configuration Wizard. Настройка соединения.
В поле Data source выберите Microsoft SQL Server (SqlClient). В поле Server name выберите свой сервер базы данных, на котором хранится база созданного проекта. В разделе Connect to a database выберите пункт Select or enter a database name и укажите имя базы данных ReportViewerSubreports и нажмите кнопку OK.
Рис. 24. Окно Add Connection добавления соединения.
Нажимайте кнопку Next (Следующий), пока не откроется окно выбора объектов базы данных. Выберите таблицы Authors (авторы) и Albums (альбомы) и нажмите кнопку Finish (Завершить).
Рис. 25. Окно Data Source Configuration Wizard. Выбор объектов базы данных.
Укажите имя DataSet_Authors подключаемому множеству данных. Выберите множество данных Authors. Нажмите кнопку OK.
Рис. 26. Окно Dataset Properties. Настройка множества данных для отчёта авторов.
Для отчёта Report_Albumb добавьте множество данных, укажите имя DataSet_Albums, ресурс ReportViewerSubreportsDataSet, множество данных Albums, и нажмите кнопку ОК.
Рис. 27. Окно Dataset Properties. Настройка множества данных для отчёта альбомов.
Рис. 28. Окна Report Data для отчётов Report_Authors (слева) и Report_Albums (справа).
В отчёте с авторами Report_Authors создайте следующую таблицу:
Рис. 29. Редактор отчёта Report_Authors. Созданная таблица.
В оставшейся ячейке кликните правой кнопкой и выберите пункт Insert (Вставить) –> Subreport (Подотчёт).
Рис. 30. Редактор отчёта Report_Authors. Добавление подотчёта в ячейку таблицы.
Ещё раз кликните правой кнопкой по ячейке с подотчётом и выберите пункт Subreport Properties.
Рис. 31. Редактор отчёта Report_Authors. Пункт меню настроек подотчёта.
В поле Name впишите имя подотчёта Subreport_Albums, а в поле Use this report as a subreport (Использовать этот отчёт как подотчёт) впишите имя второго отчёта Report_Albums, который будет использоваться как подотчёт в текущем отчёте.
Рис. 32. Окно Subreport Properties. Задание имён для подотчёта.
В разделе Parameters нажатием на кнопку Add добавьте параметр с именем AuthorID и значением [ID], который будет передаваться каждому подотчёту. Нажмите кнопку ОК.
Рис. 33. Окно Subreport Properties. Настройка передаваемых подотчёту параметров.
В отчёте с альбомами Report_Albums создайте следующую таблицу:
Рис. 34. Редактор отчёта Report_Albums. Таблица для отчёта с альбомами.
В окне Report Data кликните правой кнопкой по пункту Parameters и выберите пункт Add Parameter.
Рис. 35. Окно Report Data. Команда добавления параметра для отчёта.
В поле Name укажите имя параметра AuthorID, в поле Data type выберите тип поля Integer (целочисленный) и нажмите кнопку ОК.
Рис. 36. Окно Report Parameter Properties. Настройка добавляемого параметра отчёта сальбомами.
Кликните правой кнопкой по строке со значениями в таблице и выберите пункт Tablix Properties (Свойства таблицы). В этом же меню в пункте Row Group -> Group Properties есть раздел Page Breaks, в котором можно настроить разрыв страницы для элементов группы. Таким образом можно разбить таблицу на несколько страниц, в каждой из которых будет выводиться очередной элемент группы.
Рис. 37. Редактор отчёта Report_Albums. Пункт меню свойств таблицы.
В разделе Filters нажатием кнопки Add добавьте фильтр. Выберите в пункте Expression полеальбома AuthorID. Укажите в пункте Value только что созданный параметр [@AuthorID], нажав на кнопку справа и воспользовавшись мастером формирования выражений. Нажмите на кнопку ОК.
Рис. 38. Окно Tablix Properties. Добавление фильтра для таблицы в отчёте с авторами.
В редакторе формы перетащите с панели инструментов элемент ReportViewer. В смарт-панели выберите команду Dock in Parent Container, чтобы растянуть элемент на всю поверхность формы.
Рис. 39. Редактор главной формы. Добавление элемента ReportViewer на форму.
В смарт-панели в пункте Choose Report (Выбрать отчёт) выберите ReportViewerSubreports.Report_Authors.rdlc - отчёт с авторами. Внизу появятся элементы, связывающие отображаемый отчёт с данными. Чтобы их обновить, нужно удалить их и в смарт-панели выбрать пункт Rebind Data Sources.
Рис. 40. Редактор главной формы. Выбор отображаемого отчёта в элементе ReportViewer.
Измените код главной формы следующим образом:
using Microsoft.Reporting.WinForms;
using ReportViewerSubreports.Business;
using System;
using System.Windows.Forms;
namespace ReportViewerSubreports
{
public partial class MainForm : Form
{
Authors AuthorsBL;
Albums AlbumsBL;
ReportDataSource AlbumsDataSource;
public MainForm()
{
InitializeComponent();
AuthorsBL = new Authors();
AlbumsBL = new Albums();
}
private void MainForm_Load(object sender, EventArgs e)
{ this.AuthorsBindingSource.DataSource = AuthorsBL.GetAuthorsDT();
AlbumsDataSource = new ReportDataSource("DataSet_Albums",
AlbumsBL.GetAlbumsDT());
this.reportViewer1.LocalReport.SubreportProcessing += new
SubreportProcessingEventHandler(SubreportProcessingEventHandler);
this.reportViewer1.RefreshReport();
}
private void SubreportProcessingEventHandler(object sender,
SubreportProcessingEventArgs e)
{
e.DataSources.Add(AlbumsDataSource); }
}
}
Откомпилируйте и запустите приложение. В окне отобразится элемент ReportViewer со списком авторов, и для каждого автора отобразится таблица с альбомами, отфильтрованная по текущему автору.
Рис. 41. Запущенное приложение.