Как сериализовать дизайн отчета DevExpress XtraReport

Мне нужно сериализовать дизайн отчета. Это сценарий:

приложение имеет базовые отчеты, скажем, "отчет о продажах" с набором предопределенных столбцов и дизайна, таких как corp. логотип в заголовке. Пользователи должны иметь возможность изменять этот макет, добавляя, например, нижний колонтитул с адресом office или номерами страниц. Для этого им нужно отредактировать отчет, войти в конструктор и добавить/изменить то, что им нужно. Этот измененный макет отчета необходимо сериализовать в храниться в базе данных для этого пользователя, поэтому в следующий раз пользователь открывает этот отчет, используя этот дизайн.

смысл?

3 ответов


вот упрощенная версия того, как я делаю это:

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

Я думаю, что вы ищете метод 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");

Edit:

на ссылке на сайт поддержки devexpress, объясняющий, как сохранить определение отчета.

вы можете сохранить / загрузить в и из потока, используя переопределения Save и LoadLayout. Для конструктора можно добавить обработчик команд для перехвата команды save.

эти статьи должны охватывать то, что вам нужно:

как: сохранение и восстановление определения отчета из потока

как: переопределить команды в конструкторе конечного пользователя (Пользовательское сохранение)

и для полноты картины: Список всех как-к

Edit: исправлены ссылки