Copiando as bandas e todo conteúdo de um relatório para outro

2021-03-31

Algumas vezes é necessário usar partes de um relatório em outro. Em casos simples, você pode usar a herança de relatório para fazer isso.

Por exemplo, há um caso em que todos os relatórios possuem elementos comuns (um logotipo da empresa, assinatura, etc.). Em seguida, esses objetos podem ser movidos para um relatório pai e, ao criar relatórios filho, eles serão copiados automaticamente. Assim, você não precisa copiá-los manualmente todas as vezes, o que simplifica e acelera muito a criação de novos relatórios. Além disso, se você alterar algo no relatório pai, essas alterações também serão refletidas em todos os relatórios filho.

No entanto, a herança de relatórios tem diversas limitações. Há casos em que um relatório tinha um “pai” e era necessário fazer um “pai” um relatório completamente diferente. Pode parecer suficiente alterar a propriedade BaseReport, mas, infelizmente, não funcionará.

Entretanto, esse problema pode ser resolvido de uma maneira sofisticada - substituindo as bandas de um código de relatório por bandas de outro. Supondo que haja um relatório de linha de base (base.frx) e suas bandas precisem ser copiadas para um relatório filho (child.frx). Você precisa substituir PageHeader, PageFooter e DataBand pelo nome "Data1". Os exemplos de código a seguir presumem que ambos os relatórios estão localizados na pasta raiz da unidade C.

Primeiro, você precisa baixar os dois relatórios:

Report base = new Report();
base.Load(@"C:\base.frx");
Report child = new Report();
child.Load(@"C:\child.frx");

A próxima etapa é obter as páginas de ambos os relatórios. É importante saber os nomes das páginas. O exemplo a seguir pressupõe que o nome da página em ambos os relatórios seja "Página1":

ReportPage basePage = base.FindObject("Page1") as ReportPage;
ReportPage childPage = child.FindObject("Page1") as ReportPage;

Se você não souber os nomes das páginas, poderá obtê-los no índice. Por exemplo, ainda temos acesso às primeiras páginas de ambos os relatórios:

ReportPage basePage = baseReport.Pages[0] as ReportPage;
ReportPage childPage = childReport.Pages[0] as ReportPage;

Ambas as opções são adequadas e levam ao mesmo resultado.

Agira você troca PageHeader e PageFooter. Simples assim:

childPage.PageHeader = basePage.PageHeader;
childPage.PageFooter = basePage.PageFooter;

Essas linhas copiam as duas bandas com todas as propriedades e configurações. Além disso, todos os objetos localizados neles são duplicados e as propriedades não são perdidas.

Depois, troque o nome DataBand com "Data1":

DataBand baseBand = basePage.FindObject("Data1") as DataBand;
DataBand childBand = childPage.FindObject("Data1") as DataBand;
// you need to get the Data1 index in the child report
int childBandIndex = childPage.Bands.IndexOf(childBand);
// you can now delete it
childPage.Bands.Remove(childBand);
// and insert the band from the base report in its place
childPage.Bands.Insert(bandIndex, baseBand);

No final, a banda com todas as propriedades e objetos filhos é copiada, e a vinculação à fonte de dados que é responsável pela propriedade DataSource é transferida também. Sem essa ligação, a banda não funcionará corretamente e não produzirá dados do banco de dados.

Precisamos apenas copiar as fontes de dados. Isso é feito com o seguinte snippet de código:

for (int i = 0; i < baseReport.Dictionary.DataSources.Count; i++)
{
 childReport.Dictionary.DataSources.Add(baseReport.Dictionary.DataSources[i]);
}

Assim, todas as fontes de dados foram copiadas. Se não for necessário, você pode clonar apenas os desejados.

É isso. Algumas dezenas de linhas de código tornaram possível copiar as bandas e objetos de um relatório para outro. Se você tem muitos objetos nas bandas, é muito longo e enfadonho duplicá-los com um designer e leva ainda mais tempo para criá-los do zero.

Obviamente, se o relatório base tiver apenas as bandas copiadas neste exemplo, essa tarefa pode ser executada ainda mais facilmente - copiando e colando trivialmente o arquivo de relatório. Piadas à parte, você pode usar este método para copiar uma ou mais bandas de um conjunto quando não precisar de todas elas em um novo relatório. Ou você pode pegar um cabeçalho de página de um relatório, uma banda de dados de outro e um rodapé de um terceiro.

.NET .NET FastReport FastReport C# C#
26 de abril de 2023

How to use RFID tags in FastReport .NET

The new page object is an RFID tag in FastReport.NET allows users to use the library to create labels or maps without third-party programs
20 de abril de 2023

How to update FastReport Online Designer to the latest version

Step-by-step instructions for updating FastReport Online Designer to the latest version via the client panel.
14 de março de 2023

The Future of Report Generation with Blazor WebAssembly

Step-by-step instructions for creating a demo application on .NET 6 and 7 directly in the browser using Blazor WebAssembly in FastReport .NET.
Fast Reports
  • 800-985-8986 (English, US)
  • +31 97 01025-8466 (English, EU)
  • +49 30 56837-3928 (German, DE)
  • +55 19 98147-8148 (Portuguese, BR)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2025 Fast Reports Inc.