Создание отчета с помощью кода и немного еще
Создание отчета с помощью кода и немного еще
Возникла следующая проблема.
Очень понравилась возможность компонента по экспорту в различные форматы. Решили использовать ее при отображении различных форм приложения, содержащих табличные данные, в разных форматах (экспорта).
Для этого была написана примерно следующая функция. Сразу оговорюсь, в нее передается 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. Все Ваши примеры рассмотрел очень внимательно, в принципе с них код и писался.
Очень понравилась возможность компонента по экспорту в различные форматы. Решили использовать ее при отображении различных форм приложения, содержащих табличные данные, в разных форматах (экспорта).
Для этого была написана примерно следующая функция. Сразу оговорюсь, в нее передается 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. Все Ваши примеры рассмотрел очень внимательно, в принципе с них код и писался.
Создание отчета с помощью кода и немного еще
То что Ваш отчет долго компилируется (перед компиляцией есть еще генерация кода отчета) долго это весьма логично - объектов много, каждый объект сериализуется в код, добавляется инициализация свойств и т.д. Кроме того после определенного объема класса компиляция .Net начинает не очень красиво работать. В вашем случае Вам вообще не нужна компиляция. Все что Вам нужно сделать это добавлять страницу не в коллецкию report.Pages (в ней находятся страницы шаблона), а в коллекцию report.RenderedPages (в ней находятся странцы построенного отчета. После этого вызывать сразу экспорт отчета (или просмотр).
Спасибо.
Добавил в наш todo лист. Компонент достаточно простой поэтому сделаем быстро. Отправьте сообщение на support [at] stimulsoft [dot] com, и мы Вас известим когда он появится.И еще, когда то создавал тему о дополнительных компонентах для формы отчета. Очень помогло бы наличие RichTextBoxa, или научите, как его добавить самому?
Спасибо.
Создание отчета с помощью кода и немного еще
Извините, наверное чего то не понимаю.
Добавляю страницы в коллекцию так:
report.RenderedPages.Add(new StiPage(report));
потом добавляю к ней компоненты - текстовые поля.
В конце ваызываю метод
report.Show();
Отображается только первая страница. Что не так? Что то забыл сделать?
Добавляю страницы в коллекцию так:
report.RenderedPages.Add(new StiPage(report));
потом добавляю к ней компоненты - текстовые поля.
В конце ваызываю метод
report.Show();
Отображается только первая страница. Что не так? Что то забыл сделать?
Создание отчета с помощью кода и немного еще
Извините, я дал не полную информацию. Добавьте следующий метод до добавления страниц:
или в сегодняшем билде:
Спасибо.
Код: Выделить всё
report.Render(false);
Код: Выделить всё
report.IsRendered = true;
report.NeedsCompiling = false;
Создание отчета с помощью кода и немного еще
Спасибо, все заработало просто отлично.
И гораздо быстрее! Что не может не радовать.
И гораздо быстрее! Что не может не радовать.
Создание отчета с помощью кода и немного еще
Дайте знать, если понадобится помощь.
Спасибо.
Спасибо.
Создание отчета с помощью кода и немного еще
Добавлен новый диалоговый контрол RichTextBoxControl. Контрол будет доступен в билде от 20 апреля.BeraleX писал(а): И еще, когда то создавал тему о дополнительных компонентах для формы отчета. Очень помогло бы наличие RichTextBoxa, или научите, как его добавить самому?
Спасибо.