Создание отчета с помощью кода и немного еще
Добавлено: 09 янв 2007, 07:05
Возникла следующая проблема.
Очень понравилась возможность компонента по экспорту в различные форматы. Решили использовать ее при отображении различных форм приложения, содержащих табличные данные, в разных форматах (экспорта).
Для этого была написана примерно следующая функция. Сразу оговорюсь, в нее передается 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. Все Ваши примеры рассмотрел очень внимательно, в принципе с них код и писался.