8

我需要序列化报告设计。这是场景:

该应用程序具有基本报告,例如“销售报告”,其中包含一组预定义的列和设计,例如 corp. 标头中的徽标。用户需要能够更改该布局,例如添加带有办公室地址或页码的页脚。为此,他们需要编辑报告,输入设计器并添加/更改他们需要的内容。此更改的报表布局需要序列化以存储在该用户的数据库中,因此下一次,用户使用该设计打开该报表。

说得通?

4

3 回答 3

9

这是我如何执行此操作的简化版本:

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

在 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;
}
于 2009-08-04T04:18:47.160 回答
3

我认为您正在寻找的是 SaveLayout 方法:

保存报告

YourReport report = new YourReport();

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

加载报告

YourReport report = new YourReport();

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

编辑:

这里是 devexpress 支持站点的链接,解释了如何保存报告定义。

于 2009-08-03T13:27:46.667 回答
1

您可以使用 Save 和 LoadLayout 覆盖在流中保存/加载。对于设计器,您可以添加一个命令处理程序来拦截保存命令。

这些文章应涵盖您需要的内容:

如何:从流中保存和恢复报告定义

如何:覆盖最终用户设计器中的命令(自定义保存)

为了完整起见:所有操作指南的列表

编辑:固定链接

于 2009-08-03T20:22:15.807 回答