2009-08-03 12 views
7

Potrzebuję serializować projekt raportu. Jest to scenariusz:Jak można serializować projekt raportu DevExpress XtraReport?

Aplikacja ma raporty podstawowe, np. "Raport sprzedaży" z zestawem wstępnie zdefiniowanych kolumn i projektu, np. Corp. logo w nagłówku. Użytkownicy muszą mieć możliwość zmiany tego układu, dodając na przykład stopkę z adresem biura lub numerami stron. Aby to zrobić, trzeba edytować raport, wejść do projektanta i dodać/zmienić to, czego potrzebują. Zmieniony układ raportu musi zostać przekształcony do postaci szeregowej, aby był przechowywany w bazie danych dla tego użytkownika, więc następnym razem użytkownik otworzy ten raport, korzystając z tego projektu.

Ma sens?

Odpowiedz

9

Oto uproszczona wersja jak ja zrób to:

XtraReport customReport; 
customReport = new MyXtraReport(); 
byte[] layout = LoadCustomLayoutFromDB(); 
if (layout != null) { 
    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(layout)) { 
     customReport.LoadLayout(memoryStream); 
    } 
} 

using (XRDesignFormEx designer = new XRDesignFormEx()) { 
    MySaveCommandHandler customCommands = new MySaveCommandHandler(designer.DesignPanel); 
    designer.DesignPanel.AddCommandHandler(customCommands); 
    designer.OpenReport(customReport); 
    designer.ShowDialog(this); 
    if (customCommands.ChangesSaved) 
     SaveCustomLayoutToDB(customCommands.Layout); 
} 

Wewnątrz MySaveCommandHandler klasa:

public virtual void HandleCommand(ReportCommand command, object[] args, ref bool handled) { 
    if (command != ReportCommand.SaveFileAs && command != ReportCommand.SaveFileAs) 
     return; 

    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) { 
     panel.Report.SaveLayout(memoryStream); 
     this.layout = memoryStream.ToArray(); 
     changesSaved = true; 
    } 

    panel.ReportState = ReportState.Saved; 
    handled = true; 
} 
+0

Mam pytanie ... dlaczego zapisujesz układ do bajtu [], czy to proste, bardziej bezpośrednie zapisanie w bazie danych? Więc w metodzie SaveCustomLayoutToDb przekazujesz to do binarnej kolumny SQL Server czy coś takiego? – Sebastian

+0

@Sebastian: Tak i tak. –

+0

Dziękuję i dziękuję. ;) – Sebastian

3

myślę co szukasz jest metoda SaveLayout:

Zapisywanie raportu

YourReport report = new YourReport(); 

// Save the layout to a file. 
report.SaveLayout(@"C:\YourReport.repx"); 

Ładowanie raport

YourReport report = new YourReport(); 

// Load the layout 
report.LoadLayout(@"C:\YourReport.repx"); 

Edit:

tutaj link do strony pomocy devexpress wyjaśniającej, jak zapisać definicję raportu.

+0

Przepraszam Franciszka, ale zapisywania raportu do pliku repx nie jest, o ile mi wiadomo, serializacji. Czy wiesz, czy narzędzie ma metodę SaveToXml() czy coś? Dzięki. – Sebastian

+0

Serializacja nie oznacza, że ​​musisz zapisać informacje w pliku xml. Obecnie program DevExpress nie obsługuje zapisywania definicji raportu w formacie xml, ale zaimplementował tę funkcję w przyszłej wersji (http://www.devexpress.com/Support/Center/p/AS4336.aspx). –

+0

To prawda Francis. To nie oznacza tego. Ale IMHO to najczęstszy sposób pracy w dzisiejszych czasach. Aby serializować obiekty do formatu XML i wysyłać je przez sieć za pomocą usług WWW lub zapisywać w pliku tekstowym w bazie danych. – Sebastian

1

Możesz zapisać/załadować do i ze strumienia przy użyciu nadpisań Save i LoadLayout. Dla projektanta można dodać moduł obsługi komend, aby przechwycić polecenie składowania.

Te artykuły powinny obejmować co trzeba:

How to: Save and Restore a Report Definition from a Stream

How to: Override Commands in the End-User Designer (Custom Saving)

A dla kompletności: List of all how-to's

Edit: stałe łącza

+0

Wielkie dzięki, Dag, to dla mnie bardzo dobry krok do dalszego rozwoju. – Sebastian