2009-08-03 8 views
7

Ich muss ein Berichtsdesign serialisieren. Dies ist das Szenario:Wie kann ich ein DevExpress XtraReport-Berichtsdesign serialisieren

Die App verfügt über Basisberichte, sagen wir "Sales Report" mit einer Reihe von vordefinierten Spalten und Design, wie die Corp. Logo in der Kopfzeile. Die Benutzer müssen in der Lage sein, dieses Layout zu ändern, indem sie beispielsweise eine Fußzeile mit der Büroadresse oder Seitenzahlen hinzufügen. Dazu müssen sie den Bericht bearbeiten, den Designer eingeben und hinzufügen/ändern, was sie benötigen. Dieses geänderte Berichtslayout muss serialisiert werden, damit es in der Datenbank für diesen Benutzer gespeichert wird. Beim nächsten Mal öffnet der Benutzer diesen Bericht und verwendet dieses Design.

Macht Sinn?

Antwort

9

Hier ist eine vereinfachte Version, wie ich tun Sie dies:

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); 
} 

Innen MySaveCommandHandler Klasse:

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

Ich habe eine Frage ... Warum speichern Sie das Layout in einem Byte [], ist es einfacher, direkter in der Datenbank zu speichern? Also übergeben Sie das in der SaveCustomLayoutToDb-Methode an eine SQL Server-Binärspalte oder etwas? – Sebastian

+0

@Sebastian: Ja und ja. –

+0

Danke und Danke. ;) – Sebastian

3

Ich denke, was Sie suchen die Methode Savelayout ist:

Speichern des Berichts

YourReport report = new YourReport(); 

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

Laden der Bericht

YourReport report = new YourReport(); 

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

Edit:

hier eine link an die Devexpress-Support-Website erklären, wie die Berichtsdefinition zu speichern.

+0

Entschuldigen Sie Francis, aber den Bericht in einer Datei zu speichern repx ist nicht, wie weit ich weiß, eine Serialisierung. Wissen Sie, ob das Tool über eine SaveToXml() -Methode verfügt? Danke. – Sebastian

+0

Serialisierung bedeutet nicht, dass Sie die Informationen in einer XML-Datei speichern müssen. Momentan unterstützt DevExpress das Speichern der Berichtsdefinition in XML nicht, aber sie haben dieses Feature für eine zukünftige Version implementiert (http://www.devexpress.com/Support/Center/p/AS4336.aspx). –

+0

Das ist wahr Francis. Das bedeutet nicht, dass. Aber IMHO ist es heutzutage die gängigste Art zu arbeiten. Objekte in XML zu serialisieren und über Web-Services über die Leitung zu senden oder in einer Textdatei in der Datenbank zu speichern. – Sebastian

1

Sie können mit den Save- und LoadLayout-Überschreibungen in einem Stream speichern und laden. Für den Designer können Sie einen Befehlshandler hinzufügen, um den Sicherungsbefehl abzufangen.

sollten Diese Artikel decken, was Sie brauchen:

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

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

Und der Vollständigkeit halber: List of all how-to's

Edit: feste Verbindungen

+0

Vielen Dank Dag, das ist ein sehr guter Anhaltspunkt für mich, in der Sache weiter zu gehen. – Sebastian