Использование RepoetViewer

На главную страницу

К началу книги

Использование контрола ReportViewer в Windows приложниях

Аннотация: Данная статья написана после неудачной попытки быстро создать отчет, используя контрол ReportViewer. Поиски по нашему и зарубежному интернету, при всем обилии ссылок, не дали основного - методики использования. Пользуясь крупицами, которые нашел и не воспроизводимом примером из MSDN, мне, кажется, я смог привести в систему использование данного контрола. Материал сырой, и я буду благодарен за замечания. Если будут отличные от данного решения или уточнения и добавления - пишите - за Вашим авторством добавлю к материалу данной статьи.

В начало

Параграф 1. Вместо предисловия

Элемент управления ReportViewer - это элемент управления среды Visual Studio, который можно добавить на веб-страницу в проекте решения ASP.NET или в форму приложения Windows. Этот элемент управления включает возможности обработки и просмотра отчетов непосредственно в приложении. ReportViewer - это элемент управления, который, начиная с Visial Studio 2005, представленный контролом. Иначе, это, в отличии от Crystal Report Viewer, бесплатный редактор отчетов, который автоматически встраивается в среду Visual Web Developer 2005 Express.

По существу, ReportViewer является наиболее мощным добавлением к таким элементам управления как, GridView, DataList, DetailsView, FormView, Repeater. В ReportViewer отчёты можно создавать с помощью технологии "drag-and-drop" внутри Дизайнера Отчётов (Report Designer), входящего в среду разработки Visual Studio 2005.

В начало

Параграф 2. Источник данных

В качестве источника данных будем использовать таблицы базы данных. База данных может быть любой, но для простоты изложения выберем наиболее простую - Microsoft Access. Например, создадим простую базу с именем Animals. Последовательность создания базы, для тех, кто по какой либо причине это еще не делал, показана на рисунках 1-5. Действия выполняются после запуска Microsoft Access:

repview001.gif

Рис.1. Создание БД

Создание таблицы БД:

repview002.gif

Рис.2. Создание таблицы БД

Задание полей таблицы:

repview003.gif

Рис.3. Задание полей таблицы

После задания полей таблицы и попытки закрыть окно Table, среда запросит имя файла базы данных. Запишем любое имя, например ThisAnimals.

repview004.gif

Рис.4. Открытие созданной таблицы базы данных

Кликнем правой кнопкой мышки по имени таблицы базы данных - ThisAnimals - и в открывшейся таблице введем информацию, например такую:

repview005.gif

Рис.5. Заполнение таблицы информацией

В начало

Параграф 3. Создание проекта решения

Создадим простой Windows проект решения, как мы это делали неоднократно (Меню File/New/Project). Дадим имя проекту RepView, как показано на Рис.6:

repview006.gif

Рис.6. Создание проекта решения

Поместим на форму два контрола Button и ReportViewer, как показано на Рис.7:

repview007.gif

Рис.7. Добавление рабочих контролов

Проект создан, но прежде чем заполнять его кодом, отвлечемся на источник информации.

В начало

Параграф 4. Источник данных для отображения

Нажимаем в правом верхнем углу контрола треугольничек и выбираем пункт Design a new Report (Рис.7.). В появившемся окне редактора ReportViewer, нажимаем кнопку "Add New Source.."(Рис.8.)

repview008.gif

Рис.8. Добавление источника данных

Прежде чем выбрать DateBase и нажать кнопку Next (Рис.9.), мы можем скопировать файл созданной выше базы данных (файл Animals.mdb) в директорию проекта решения (хотя это и не является обязательным, среда предложит Вам позже выполнить это еще раз, но и там у Вас останется право выбора).

repview009.gif

Рис.9. Добавление источника данных

Нажимаем кнопку New и далее выбираем DataSource и DataFileName, как показано на Рис.10.

repview010.gif

Рис.10. Добавление DataSource и DataFileName

В результате выбора получим результат:

repview011.gif

Рис.11. Результат выбора источника данных

После нажатия кнопки Next не соглашаемся включить файл базы данных в текущий проект (зависит от цели задачи).

Результат мы видим на Рис.12:

repview012.gif

Рис.12. Результат выбора источника данных

Нажимаем кнопку Finish. Результат выбора источника данных будет иметь вид Рис.13:

repview013.gif

Рис.13. Результат выбора источника данных

В начало

Параграф 5. Отображение данных

Кликнем мышкой в поле дизайнера Report1.rdlc и в меню View выберем ToolBox. В результате в проекте отобразится ToolBox, с контролами, которые доступны для использования в ReportViewer (Рис.14.). Здесь мы видим все доступные для отображения в ReportViever контролы. Вначале будем использовать таблицу. Перетащим таблицу на панель дизайнера:

repview014.gif

Рис.14. Добавление таблицы в дизайнер ReportViever

Вновь вернемся на вкладку DtatSource и перетащим поля источника во вторую строку таблицы, как показано на Рис.15.

repview015.gif

Рис.15. Добавление полей отображения в ReportViever

Мы можем перетащить поля и в третью строку. При этом, по умолчанию, ячейка таблицы будет восприниматься как сумма содержимого ячеек данного столбца:

=Sum(Fields!Numbers.Value)

Достаточно кликнуть правой кнопкой мышки по данной ячейке и выбрать пункт "fx Expression..." мы отобразим окно "Edit Expression", где можно подобрать любую другую функцию из множества доступных. Для нашего примера в первой ячейке третьей строки запишем просто слово "Итого".

Если мы выполним решение на данном этапе, то получим сообщение:

The sourse on the report difination has not been specified

Иначе, мы определили структуру отображения, но пока не дали сами данные для отображения. Однако, учитывая, что Visual Studiо сохраняет все при выполнении решения, мы, тем самым сохранили и файл Report1.rdlc, который на данный момент содержит структуру отображения данных и структуру ее источников в виде нашего AnimalsDataSet.

private void button1_Click(object sender, EventArgs e)
{           
 DataSet MyDataSet = new DataSet();
 string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
 //Там где находится файл базы данных
 string sBank = @"C:\Bases\Animals.mdb";
 string sSql = "Select * from thisanimals";
 using (OleDbConnection oleConn = new OleDbConnection(connectionString + sBank))
 {
  try
  {
   oleConn.Open();
   OleDbCommand olecmd = new OleDbCommand(sSql, oleConn);
   olecmd.CommandType = CommandType.Text;
   OleDbDataAdapter da = new OleDbDataAdapter(olecmd);
   da.Fill(MyDataSet);
  }
  catch (Exception/* ex*/)
  {
    return;
  }
 }          
 reportViewer1.ProcessingMode = ProcessingMode.Local;
 reportViewer1.LocalReport.ReportEmbeddedResource = "RepView.Report1.rdlc";
 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(
                        "AnimalsDataSet_ThisAnimals", MyDataSet.Tables[0]));            
 this.reportViewer1.RefreshReport();
}

Следует особо обратить внимание на то, как заданы ReportEmbeddedResource (RepView.Report1.rdlc) и DataSources - ("AnimalsDataSet_ThisAnimals", MyDataSet.Tables[0]). Нарушение пунктуации приведет к ошибке. Выполним решение и увидим результат (Рис.16.):

repview016.gif

Рис.16. Использование ReportViever для отображения табличных данных

Теперь добавим контрол Chart со вкладки Tools ReportViewer. И, как показано на Рис.17. перетащим поля в своеобразные ушки контрола, которые появляются при двойном клике мышкой в поле контрола.

repview017.gif

Рис.17. Использование ReportViever для отображения табличных данных

Кликнем правой кнопкой мышки на контроле Chart и выберем пункт Properties - увидим панель, позволяющую выбрать практически все стандартные диаграммы Microsoft (Word, Excel) и задать множество свойств. Выберем понравившуюся нам диаграмму (Рис.18.).

repview018.gif

Рис.18. Выбор диаграммы

После нажатия кнопки OK, выполним решение. Результат показан на Рис.19:

repview019.gif

Рис.19. Выбор диаграммы

В начало

Параграф 6. Упрощенный способ отображения данных

Владимир Розанов (инженер-программист, Полесский государственный университет) прислал письмо:

Спасибо за статью. Дополнение. Загрузка информации из базы данных 
ReportViewer может производить без включения программных кодов, как вы 
предлагаете (через свойства). 

Спасибо Владимиру, именно благодаря ему, мне пришлось продолжить статью. Я вполне согласен с Владимиром, достаточно установить свойства, как показано на Рис.20., и написать код, приведенный ниже, и при загрузке решения на выполнение мы получим тот же результат, что и на Рис.19. Этого во многих случаях, вполне достаточно для выполнения цели создания приложения.

private void Form1_Load(object sender, EventArgs e)
{
 this.ThisAnimalsTableAdapter.Fill(this.AnimalsDataSet.ThisAnimals);
 this.reportViewer1.RefreshReport();    
}

repview020.gif

Рис.20. Упрощенный способ отображения данных

Однако, мы, при этом, теряем гибкость отображения. Для каждого использования ReportViewer потребуется создать свой файл ReportEmbeddedResource (RepView.Report1.rdlc, RepView.Report2.rdlc....). Приведенный же метод позволяет использовать многократно один и тот же файл ReportEmbeddedResource. Простейший пример приводится ниже.

В начало

Параграф 7. Использование одного ReportEmbeddedResource для вывода различных отчетов

Создадим еще одну таблицу в нашей базе данных (связанную по id с ранее созданной), как показано на Рис.21.,:

repview021.gif

Рис.21. Создание дополнительной таблицы

Добавим еще одну кнопку и контрол Label на форму, и будем использовать следующий код (приводится полностью):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using Microsoft.Reporting.WinForms;
namespace RepView
{
 public partial class Form1 : Form
 {
  string sSql = string.Empty;
  public Form1()
  {
   InitializeComponent();
  }
  private void Form1_Load(object sender, EventArgs e)
  {   
   label1.Text = "";
   this.ThisAnimalsTableAdapter.Fill(this.AnimalsDataSet.ThisAnimals);
   this.reportViewer1.RefreshReport();              
  }
  private void button1_Click(object sender, EventArgs e)
  {

   sSql = "Select * from thisanimals order by id";

   label1.Text = "Число зверей в зверинце:";
   vLoadData();
  }
  private void button2_Click(object sender, EventArgs e)
  {
   label1.Text = "Число сотрудников ухаживающих за животными";

   sSql = "Select ta.id as id,ta.name as name,ws.numbers as numbers from thisanimals ta ";  
   sSql +="left join workers ws on ws.id=ta.id order by  ta.id";  

   vLoadData();      
  }
  private void vLoadData()
  {
   reportViewer1.LocalReport.DataSources.Clear();            
   DataSet MyDataSet = new DataSet();
   string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
   string sBank = @"C:\Bases\Animals.mdb";            
   using (OleDbConnection oleConn = new OleDbConnection(connectionString + sBank))
   {
    try
    {
     oleConn.Open();
     OleDbCommand olecmd = new OleDbCommand(sSql, oleConn);
     olecmd.CommandType = CommandType.Text;
     OleDbDataAdapter da = new OleDbDataAdapter(olecmd);
     da.Fill(MyDataSet);
    }
    catch (Exception/* ex*/)
    {
     return;
    }
   }
   reportViewer1.ProcessingMode = ProcessingMode.Local;
   reportViewer1.LocalReport.ReportEmbeddedResource = "RepView.Report1.rdlc";
   this.reportViewer1.LocalReport.DataSources.Add(
        new ReportDataSource("AnimalsDataSet_ThisAnimals", MyDataSet.Tables[0]));
   this.reportViewer1.RefreshReport();
  }   
 }
}

Цветом выделено предложение Select. Второе из них приводит названия выбираемых полей из двух таблиц к их названиям в созданном нами "AnimalsDataSet.ThisAnimals". Это приведение и позволяет использовать файл "ReportEmbeddedResource" уже созданный нами для отображения новых данных.

Результат выполнения приложения при поочередном нажатии кнопок 1 и 2 показан на Рис.22:

repview022.gif

Рис.22. Использование одного ReportEmbeddedResource для вывода различных отчетов

В начало

Скачать код примеров

Распаковав скачанный файл вы найдете одну директорию, с решением, содержащим код последнего примера и файл Animals.mdb. Директорию с решением можно поместить в любое место любого жесткого диска, для последующего его открытия в Visual Studio 2005 и выше. Файл базы данных Animals.mdb должен быть помещен в директорию C:\Bases\, которую Вам придется создать. После этого Вы можете продолжить эксперименты с кодом.

Скачать коды примеров ~112 кб.

Молчанов Владислав 25.11.2008г.

Еcли Вы пришли с поискового сервера - посетите мою главную страничку

На главной странице Ва узнаете, как я могу помочь Вам в написании офисной программы любой сложности в соответствии с Вашими запросами. И найдете ряд програм или ссылок на образцы.

Кроме того - на главной странице Вы найдете бесплатные программы: программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).

В начало страницы

На главную страницу

К началу книги


Сайт управляется системой uCoz