|
При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Создание отчетов Crystal Reports.NET в графическом режиме
Настройка отчета
Теперь подошла очередь присоединить наш отчет к созданному объектному источнику данных и настроить его (отчет).
-
Перейдите в графический
режим дизанера отчетов Report Designer и выполните команду контекстного
меню Database/Database Expert
-
Раскройте узел Project
Data и поместите в правый список таблицу Customers
Обратите внимание, что эксперты, вызываемые в режиме Report Designer, отличаются только заголовками окон от вкладок мастера Standard Report Creation Wizard, который мы использовали в предыдущем упражнении. Ну и правильно, проще подставлять новые заголовки, чем дублировать весь инструмент, да и нам попривычнее будет!
-
Щелкните на кнопке OK и отчет окажется подключенным к созданному ранее строго типизированному
источнику данных -
Откройте панель Field
Explorer через меню Crystal Reports, контекстное меню Report
Designer или щелчком на пиктограмме панели интсрументов 'Crystal
Reports - Main' и
разверните в ней узел Database Fields/Customers
-
Перетащите в секцию Details формы отчета поля CustomerID, CompanyName, Address, Region и
распределите их равномерно по ширине листа. Позже мы скорректируем ширину рабочих
полей, когда настроим приложение на просмотр отчета.
После отпускания кнопки мыши одновременно в секции Page Header тоже появится заголовок поля текстового типа, который можно отредактировать. Имена столбцов в секции Details не редактируются, а редактируется только их формат через команду Format Object контекстного меню. Следует иметь ввиду, что вертикальный размер секции Details определяет междустрочное расстояние выводимой в рабочую область отчета информации.
-
Перейдите на вкладку Main
Report Preview эксперта Report Designer
Здесь можно увидеть, что в рабочей области отчета вместо реальных данных таблицы Customers подставляются дежурные значения, генерируемые Crystal Reports. Это происходит потому, что мы не напрямую соединились с БД, как это было в предыдущем упражнении, а через набор данных. На этапе проектирования созданный нами ранее типизированный набор данных заполнен только схемой таблицы Customers, поэтому Crystal Reports видит сейчас только названия полей и их типы. Но сам типизированный набор пока не содержит реальных данных таблицы и в отчет помещаются случайные данные, чтобы можно было представить их будущее расположение
-
Вернитесь на вкладку Main Report и поместите в секцию Report Header из раздела Special
Fields панели Field Explorer поле Report Title
-
Выполните команду меню Crystal Reports/Report/Summary Info и заполните поле Title названием
отчета, например, 'Отчет
компании Рога и Копыта' -
Настройте стиль заголовка
по своему вкусу через контекстное меню поля Report Title, выполнив команду Format Object. Проследите через режим Main Report Preview,
чтобы текст заголовка помещался в поле - Поместите в секцию Report Header из раздела Special Fields панели Field Explorer поля Data Date и Data Time и настройте их стиль по вкусу, вызвав через контекстное меню командой Format Object окно Format Editor. Проследите через режим Main Report Preview, чтобы содержимое помещалось в поле. Пользуйтесь групповым выделением полей отчета и перемещением в рамках секции с помощью клавиатурных стрелок.
Система Crystal Reports позволяет очень красиво и тонко настроить отчет, но в данном упражнении нам пока достаточна выполненных простых возможностей.
Интеграция отчета в приложение
Вспомните, что Crystal Reports может работать в двух режимах: Pull -выталкивание и Push -заталкивание. Мы в данном упражнении хотим реализовать режим Push и для этого подготовили форму простого отчета вручную с помощью Report Designer. Это форма отчета должна храниться в отдельном файле CrystalReport1.rpt вместе со сборкой и загружаться приложением из кода. Мы также подготовили типизированный источник данных NorthwindDataSet, который имеет все необходимые настройки для связи с БД и выборки нужных нам данных. Строка соединения хранится в конфигурационном файле. На форме Form1 размещен объект с именем crystalReportViewer1 для отображения отчета на этапе выполнения. Теперь осталось связать все вместе с помощью кода.
-
Перейдите в режим Form
Designer для формы Form1 и двойным щелчком на ее заголовке (потому
что в клиентской области размещен объект CrystalReportViewer ) создайте
обработчик события Load, который заполните так
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Windows.Forms;
namespace WinReport2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Создаем адаптер типизированного набора, в котором уже
// содержатся все настройки для извлечения нужных данных
// Классы сгенерированы оболочкой при создании набора данных
NorthwindDataSetTableAdapters.CustomersTableAdapter adapter =
new WinReport2.NorthwindDataSetTableAdapters.CustomersTableAdapter();// Сгенерированный класс
// Извлекаем данные из БД
NorthwindDataSet.CustomersDataTable table = adapter.GetData();// Сгенерированные составной класс
// Создаем объект документа отчета
ReportDocument reportDocument = new ReportDocument();
// Загружаем шаблон отчета
reportDocument.Load("CrystalReport1.rpt");// !!! Должен стоять перед загрузкой данными
// Заталкиваем (Push) данные по шаблону
reportDocument.SetDataSource(table as DataTable);// !!! Должен стоять после загрузки отчета
//reportDocument.Database.Tables["Customers"].SetDataSource(dataSet.Tables["Customers"]);// Вариант
crystalReportViewer1.ReportSource = reportDocument;// Привязываем к элементу отображения отчета
// Донастраиваем объект отображения отчета
crystalReportViewer1.ShowGroupTreeButton = false;// Отключить кнопку
crystalReportViewer1.DisplayGroupTree = false; // Отключить панель
// Вариант. Если передается параметр Test типа DateTime
//reportDocument1.SetParameterValue("Test", DateTime.Now);
//crystalReportViewer1.ReportSource = reportDocument;
}
}
}Обратите внимание, что мы вначале создаем объект, производный от класса DataTable, и извлекаем в него данные из базы в соответствии с настройками набора данных NorthwindDataSet через созданный в нем адаптер CustomersTableAdapter. Далее создаем объект отчета ReportDocument и загружаем в него созданный шаблон отчета CrystalReport1.rpt.
-
Проследите, чтобы настройки
файла CrystalReport1.rpt заставляли оболочку копировать шаблон
в каталог размещения исполнимой сборки приложения (точно также, как файл
БД) при его компиляции
Особенно важно, чтобы шаблон отчета CrystalReport1.rpt оказался в объекте отчета ReportDocument раньше загрузки туда самих данных, поскольку во время загрузки он выполняет форматирование данных, пропуская их через себя. А далее мы связываем объект просмотра с самим отчетом и попутно донастраиваем его. Вот пока и все, наступил момент истины!
-
Запустите приложение
и полюбуйтесь на результат, который вы и я сами сделали вручную, можно сказать,
с нуля
Нам необязательно идти таким сложным путем через создание типизированного набора данных. В предыдущих лабораторных работах мы создавали нетипизированные наборы данных и заполняли их нужными данными. Учитывая, что шаблоны отчетов могут существовать самостоятельно в отдельных файлах, можно заранее их изготовить под готовые структуры данных, а потом в коде загружать в документ отчета необходимые данные и необходимую форму отчета. Можно воспользоваться и готовыми формами отчетов, созданными другими людьми. Существуют, также, способы управлять объектом отчета и программно, по мы их в данном упражнении рассматривать не будем.



