¿Cómo puedo serializar un diseño de informe DevExpress XtraReport?
-
10-07-2019 - |
Pregunta
Necesito serializar un diseño de informe. Este es el escenario:
La aplicación tiene informes base, digamos " Informe de ventas " con un conjunto de columnas y diseño predefinidos, como el corp. logo 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 los números de página. Para hacerlo, deben editar el informe, ingresar al diseñador y agregar / cambiar lo que necesitan. Este diseño de informe modificado debe ser serializado para almacenarse en la base de datos de ese usuario, por lo que la próxima vez, el usuario abre ese informe, utilizando ese diseño.
¿Tiene sentido?
Solución
Aquí hay una versión simplificada de cómo hago 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);
}
Dentro de la clase 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;
}
Otros consejos
Creo que lo que está buscando es el método SaveLayout:
Guardar el informe
YourReport report = new YourReport();
// Save the layout to a file.
report.SaveLayout(@"C:\YourReport.repx");
Carga del informe
YourReport report = new YourReport();
// Load the layout
report.LoadLayout(@"C:\YourReport.repx");
Editar:
aquí un enlace al sitio de soporte devexpress que explica cómo guarde la definición del informe.
Puede Guardar / Cargar hacia y desde una secuencia usando las anulaciones de Guardar y Cargar diseño. Para el diseñador, puede agregar un controlador de comandos para interceptar el comando guardar.
Estos artículos deben cubrir lo que necesita:
Cómo: Guardar y restaurar una definición de informe desde un Transmitir
Cómo: Anular comandos en el Diseñador del usuario final (Ahorro personalizado)
Y para completar: Lista de todos los procedimientos
Editar: enlaces fijos