Страница 1 из 1

Создание отчета с помощью кода и немного еще

Добавлено: 09 янв 2007, 07:05
BeraleX
Возникла следующая проблема.
Очень понравилась возможность компонента по экспорту в различные форматы. Решили использовать ее при отображении различных форм приложения, содержащих табличные данные, в разных форматах (экспорта).

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

public void ShowReportGrid(DataGridView Grid)
{
StiReport report = new StiReport();
StiPage page = report.Pages[0];
double pos = 0;
double columnWidth = StiAlignValue.AlignToMinGrid(page.Width / Grid.ColumnCount, 0.1, true);
int i = 0;
double CurrentHeight = 0;

//Создание заголовка таблицы
foreach (DataGridViewColumn dataColumn in Grid.Columns)
{
i++;
StiText headerText = new StiText(new RectangleD(pos, TitleHeight, columnWidth, 0.5));
headerText.Text.Value = dataColumn.HeaderText;
headerText.HorAlignment = StiTextHorAlignment.Center;
headerText.VertAlignment = StiVertAlignment.Center;
headerText.Name = "HeaderText" + i.ToString();
headerText.Border.Side = StiBorderSides.All;
page.Components.Add(headerText);
pos = pos + columnWidth;
}

CurrentHeight += 0.5;

//Создание страниц отчета и тела таблицы
for (int x = 0; x StiAlignValue.AlignToMinGrid(page.Height, 0.1, true))
{
//if (report.Pages.Count >9) break;
StiPage page1 = new StiPage(report);
page1.PageHeight = 29.7;
page1.PageWidth = 21;
page1.Name = "Page" + (report.Pages.Count+1).ToString();
report.Pages.Add(page1);
page = report.Pages[report.Pages.Count - 1];
CurrentHeight = 0;
}
for (int y = 0; y < Grid.Columns.Count; y++)
{
StiText cellText = new StiText(new RectangleD(pos, CurrentHeight, columnWidth, 0.5));
if (Grid[y, x].Value != null) cellText.Text.Value = Grid[y, x].Value.ToString();
else cellText.Text.Value = "";
cellText.HorAlignment = StiTextHorAlignment.Center;
cellText.VertAlignment = StiVertAlignment.Center;
cellText.Name = "cellText" + y.ToString() + x.ToString();
cellText.Brush = new StiSolidBrush(Grid[y, x].Style.BackColor);
cellText.Border.Side = StiBorderSides.All;
page.Components.Add(cellText);
pos = pos + columnWidth;
}
CurrentHeight += 0.5;
}
//Отображение отчета
report.Render(true);
report.Show();
}

Проблемы две:
1) Не основная - отчет из 10 страниц компилируется достаточно долго, от 1 мин. и более.
2) Главная, начиная примерно с 20 страниц при компиляции отчета вообще вылетает ошибка, причем не Netовская, а Виндовая с предложение отправить отчет об ошибке.

Посоветуйте, как избежать данной ситуации?

И еще, когда то создавал тему о дополнительных компонентах для формы отчета. Очень помогло бы наличие RichTextBoxa, или научите, как его добавить самому?

Заранее спасибо.

P.S. Все Ваши примеры рассмотрел очень внимательно, в принципе с них код и писался.

Создание отчета с помощью кода и немного еще

Добавлено: 09 янв 2007, 07:56
Vital
То что Ваш отчет долго компилируется (перед компиляцией есть еще генерация кода отчета) долго это весьма логично - объектов много, каждый объект сериализуется в код, добавляется инициализация свойств и т.д. Кроме того после определенного объема класса компиляция .Net начинает не очень красиво работать. В вашем случае Вам вообще не нужна компиляция. Все что Вам нужно сделать это добавлять страницу не в коллецкию report.Pages (в ней находятся страницы шаблона), а в коллекцию report.RenderedPages (в ней находятся странцы построенного отчета. После этого вызывать сразу экспорт отчета (или просмотр).
И еще, когда то создавал тему о дополнительных компонентах для формы отчета. Очень помогло бы наличие RichTextBoxa, или научите, как его добавить самому?
Добавил в наш todo лист. Компонент достаточно простой поэтому сделаем быстро. Отправьте сообщение на support [at] stimulsoft [dot] com, и мы Вас известим когда он появится.


Спасибо.

Создание отчета с помощью кода и немного еще

Добавлено: 09 янв 2007, 09:46
BeraleX
Извините, наверное чего то не понимаю.
Добавляю страницы в коллекцию так:
report.RenderedPages.Add(new StiPage(report));
потом добавляю к ней компоненты - текстовые поля.
В конце ваызываю метод
report.Show();
Отображается только первая страница. Что не так? Что то забыл сделать?

Создание отчета с помощью кода и немного еще

Добавлено: 09 янв 2007, 12:23
Vital
Извините, я дал не полную информацию. Добавьте следующий метод до добавления страниц:

Код: Выделить всё

report.Render(false);
или в сегодняшем билде:

Код: Выделить всё

report.IsRendered = true;
report.NeedsCompiling = false;
Спасибо.

Создание отчета с помощью кода и немного еще

Добавлено: 10 янв 2007, 04:54
BeraleX
Спасибо, все заработало просто отлично.
И гораздо быстрее! Что не может не радовать.

Создание отчета с помощью кода и немного еще

Добавлено: 10 янв 2007, 05:17
Edward
Дайте знать, если понадобится помощь.

Спасибо.


Создание отчета с помощью кода и немного еще

Добавлено: 20 апр 2007, 11:21
Vital
BeraleX писал(а): И еще, когда то создавал тему о дополнительных компонентах для формы отчета. Очень помогло бы наличие RichTextBoxa, или научите, как его добавить самому?
Добавлен новый диалоговый контрол RichTextBoxControl. Контрол будет доступен в билде от 20 апреля.

Спасибо.