2009-08-03 54 views
7

Necesito serializar un diseño de informe. Este es el escenario:¿Cómo puedo serializar un diseño de informe de DevExpress XtraReport?

La aplicación tiene informes base, digamos "Informe de ventas" con un conjunto de columnas y diseños predefinidos, como el corp. logotipo en el encabezado. Los usuarios deben tener la capacidad de cambiar ese diseño agregando, por ejemplo, un pie de página con la dirección de la oficina o números de página. Para hacer eso, necesitan editar el informe, ingresar al diseñador y agregar/cambiar lo que necesitan. Este diseño de informe modificado debe ser serializado para ser almacenado en la base de datos para ese usuario, por lo que la próxima vez, el usuario abre ese informe, usando ese diseño.

Tiene sentido?

Respuesta

9

Aquí es una versión simplificada de cómo haz esto:

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

clase Dentro MySaveCommandHandler:

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

Tengo una pregunta ... ¿por qué guarda el diseño en un byte [], es simple, más directo para guardar en la base de datos? Entonces, ¿en el método SaveCustomLayoutToDb pasa eso a una columna binaria de SQL Server o algo así? – Sebastian

+0

@Sebastian: Sí y sí. –

+0

Gracias y gracias. ;) – Sebastian

3

Creo que lo que busca es el método SaveLayout:

Guardar el informe

YourReport report = new YourReport(); 

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

Cargando el informe

YourReport report = new YourReport(); 

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

Editar:

aquí link al sitio de soporte devexpress que explica cómo guardar la definición del informe.

+0

Disculpe Francis, pero guardar el informe en un archivo repx no es, por lo que yo sé, una serialización. ¿Sabe si la herramienta tiene un método SaveToXml() o algo así? Gracias. – Sebastian

+0

La serialización no significa que tenga que guardar la información en un archivo xml. En este momento, DevExpress no admite guardar la definición del informe en xml, pero implementaron esta característica para una versión futura (http://www.devexpress.com/Support/Center/p/AS4336.aspx). –

+0

Eso es verdad Francis. No significa eso. Pero en mi humilde opinión es la forma más común de trabajar en estos días. Para serializar objetos en XML y enviarlos a través del cable utilizando servicios web o guardarlos en un archivo de texto en la base de datos. – Sebastian

1

Puede guardar/cargar desde y hacia una secuencia usando las anulaciones de Guardar y Cargar. Para el diseñador, puede agregar un controlador de comando para interceptar el comando guardar.

Estos artículos deben cubrir lo que necesita:

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

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

está completo y si: List of all how-to's

Editar: enlaces fijos

+0

Muchas gracias Dag, esa es una muy buena pista para mí para ir más allá en el asunto. – Sebastian

Cuestiones relacionadas