Czasami zachodzi potrzeba użycia części jednego raportu w innym. W prostych przypadkach można do tego celu wykorzystać dziedziczenie raportów.
Przykładem może być sytuacja, w której wszystkie raporty posiadają wspólne elementy (logo firmy, podpis, itp.). Wówczas obiekty te można przenieść do raportu nadrzędnego, a podczas tworzenia raportów podrzędnych będą one automatycznie skopiowane. Nie trzeba więc za każdym razem kopiować ich ręcznie, co znacznie upraszcza i przyspiesza tworzenie nowych raportów. Ponadto, jeśli zmienisz coś w raporcie nadrzędnym, zmiany te zostaną również odzwierciedlone we wszystkich raportach podrzędnych.
Dziedziczenie raportów ma jednak pewne ograniczenia. Zdarzają się przypadki, gdy raport miał jeden format "macierzysty" i zachodzi konieczność uczynienie "macierzystym" zupełnie innego raportu. Mogłoby się wydawać, że wystarczy zmienić właściwość BaseReport, ale niestety to się nie uda.
Niemniej jednak taki problem można rozwiązać w inny sposób – zastępując pasma z jednego kodu raportu pasmami z innego.
Załóżmy, że istnieje raport bazowy (base.frx) i jego paasma muszą zostać skopiowane do raportu podrzędnego (child.frx). Musisz zastąpić PageHeader, PageFooter oraz DataBand nazwą "Data1". Poniższe przykłady kodu zakładają, że oba raporty znajdują się w folderze głównym dysku C.
Najpierw należy pobrać oba raporty:
Następnym krokiem jest pobranie stron z obu raportów. Ważne jest, aby znać nazwy stron. W poniższym przykładzie założono, że nazwa strony w obu raportach to "Page1":
ReportPage basePage = base.FindObject("Page1") as ReportPage; ReportPage childPage = child.FindObject("Page1") as ReportPage;
Jeśli nie znasz nazw stron, możesz je uzyskać z indeksu. Na przykład, dalej uzyskujemy dostęp do pierwszych stron obu raportów:
ReportPage basePage = baseReport.Pages[0] as ReportPage; ReportPage childPage = childReport.Pages[0] as ReportPage;
Obie opcje są właściwe i prowadzą do tego samego rezultatu
Teraz możesz zastąpić PageHeader i PageFooter. Jest to bardzo proste:
childPage.PageHeader = basePage.PageHeader; childPage.PageFooter = basePage.PageFooter;
Linie te kopiują dwa pasma wraz z ich wszystkimi właściwościami i ustawieniami. Dodatkowo wszystkie obiekty znajdujące się na nich są dublowane, a ich właściwości są zachowane.
Następnie zamień nazwę DataBand na nazwę "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);
Na koniec zostanie skopiowany zespół ze wszystkimi właściwościami i obiektami podrzędnymi oraz zostanie również przeniesione powiązanie ze źródłem danych, które jest odpowiedzialne za właściwość DataSource. Bez tego powiązania zespół nie będzie działał poprawnie i nie będzie wyprowadzał danych z bazy.
Pozostaje nam tylko skopiować źródła danych. Robi się to za pomocą poniższego fragmentu kodu:
for (int i = 0; i < baseReport.Dictionary.DataSources.Count; i++) { childReport.Dictionary.DataSources.Add(baseReport.Dictionary.DataSources[i]); }
W ten sposób wszystkie źródła danych zostały skopiowane. Jeśli nie jest to konieczne, możesz sklonować tylko te pożądane.
To wszystko. Kilkadziesiąt linii kodu umożliwiło skopiowanie pasm i obiektów z jednego raportu do drugiego. Jeśli mamy dużo obiektów na pasmach, to powielanie ich za pomocą dizajnera jest dość długie i nudne, a tworzenie ich od podstaw zajmuje jeszcze więcej czasu.
Oczywiście, jeśli raport bazowy zawierał tylko skopiowane pasma w tym przykładzie, wtedy to zadanie może być wykonane jeszcze prościej - poprzez trywialne kopiowanie i wklejenie pliku raportu. Żarty na bok, możesz użyć tej metody do skopiowania jednego lub więcej pasm z zestawu, gdy nie potrzebujesz ich wszystkich w nowym raporcie. Można też wziąć nagłówek strony z jednego raportu, pasmo danych z drugiego, a stopkę z trzeciego.