Back to Devexpress

Override Commands in the End-User Report Designer (Implement Custom Saving)

xtrareports-2211-desktop-reporting-winforms-reporting-end-user-report-designer-for-winforms-api-and-customization-override-commands-in-end-user-report-designer-implement-custom-saving.md

latest8.3 KB
Original Source

Override Commands in the End-User Report Designer (Implement Custom Saving)

  • Aug 18, 2023
  • 4 minutes to read

View Example: WinForms Reporting - How to Override End-User Report Designer Commands

This example shows how to override the SaveFile and OpenFile commands in the End-User Report Designer.

csharp
using System;
using System.Windows.Forms;
using DevExpress.XtraReports.UserDesigner;

namespace CustomSavingEUD {
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }

        // Create an MDI (multi-document interface) controller instance.
        XRDesignMdiController mdiController;

        private void button1_Click(object sender, EventArgs e) {
            // Create a design form and get its MDI controller.
            XRDesignForm form = new XRDesignForm();
            mdiController = form.DesignMdiController;

            // Handle the DesignPanelLoaded event of the MDI controller,
            // to override the SaveCommandHandler for every loaded report.
            mdiController.DesignPanelLoaded +=
                new DesignerLoadedEventHandler(mdiController_DesignPanelLoaded);

            // Override the Open Command.
            mdiController.AddCommandHandler(new OpenCommandHandler());

            // Open an empty report in the form.
            mdiController.OpenReport(new XtraReport1());

            // Show the form.
            form.ShowDialog();
            if (mdiController.ActiveDesignPanel != null) {
                mdiController.ActiveDesignPanel.CloseReport();
            }
        }
        void mdiController_DesignPanelLoaded(object sender, DesignerLoadedEventArgs e) {
            XRDesignPanel panel = (XRDesignPanel)sender;
            // Override the Save Command.
            panel.AddCommandHandler(new SaveCommandHandler(panel));
        }
    }
}
vb
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports DevExpress.XtraReports.UserDesigner

Namespace CustomSavingEUD
    Partial Public Class Form1
        Inherits Form

        Public Sub New()
            InitializeComponent()
        End Sub

        ' Create an MDI (multi-document interface) controller instance.
        Private mdiController As XRDesignMdiController

        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click
            ' Create a design form and get its MDI controller.
            Dim form As New XRDesignForm()
            mdiController = form.DesignMdiController

            ' Handle the DesignPanelLoaded event of the MDI controller,
            ' to override the SaveCommandHandler for every loaded report.
            AddHandler mdiController.DesignPanelLoaded, AddressOf mdiController_DesignPanelLoaded

            'Override the Open Command.
            mdiController.AddCommandHandler(New OpenCommandHandler())

            ' Open an empty report in the form.
            mdiController.OpenReport(New XtraReport1())

            ' Show the form.
            form.ShowDialog()
            If mdiController.ActiveDesignPanel IsNot Nothing Then
                mdiController.ActiveDesignPanel.CloseReport()
            End If
        End Sub
        Private Sub mdiController_DesignPanelLoaded(ByVal sender As Object, ByVal e As DesignerLoadedEventArgs)
            Dim panel As XRDesignPanel = DirectCast(sender, XRDesignPanel)
            panel.AddCommandHandler(New SaveCommandHandler(panel))
        End Sub
    End Class
End Namespace

The following code shows the Save and Open command handlers that implement the ICommandHandler interface:

csharp
using DevExpress.XtraReports.UserDesigner;
public class SaveCommandHandler : ICommandHandler {
    XRDesignPanel panel;

    public SaveCommandHandler(XRDesignPanel panel) {
        this.panel = panel;
    }

    public void HandleCommand(ReportCommand command,
    object[] args) {
        // Save the report.
        Save();
    }

    public bool CanHandleCommand(ReportCommand command,
    ref bool useNextHandler) {
        useNextHandler = !(command == ReportCommand.SaveFile ||
            command == ReportCommand.SaveFileAs);
        return !useNextHandler;
    }

    void Save() {
        // Write your custom method here.
        // ...

        // Example:
        panel.Report.SaveLayout("report1.repx");

        // Prevent the "Report has been changed" dialog from being shown.
        panel.ReportState = ReportState.Saved;
    }
}
csharp
using System.Windows.Forms;
using DevExpress.XtraReports.UserDesigner;

public class OpenCommandHandler : ICommandHandler {
    public OpenCommandHandler() {
    }

    public void HandleCommand(ReportCommand command,
    object[] args) {
        switch (command) {
            case ReportCommand.OpenFile:
                Open();
                break;
        }
    }

    public bool CanHandleCommand(ReportCommand command,
    ref bool useNextHandler) {
        useNextHandler = !(command == ReportCommand.OpenFile);
        return !useNextHandler;
    }

    void Open() {
        MessageBox.Show("Open");
    }
}
vb
Imports DevExpress.XtraReports.UserDesigner

Public Class SaveCommandHandler
    Implements ICommandHandler

    Private panel As XRDesignPanel

    Public Sub New(ByVal panel As XRDesignPanel)
        Me.panel = panel
    End Sub

    Public Sub HandleCommand(ByVal command As ReportCommand, ByVal args() As Object) Implements ICommandHandler.HandleCommand
        ' Save the report.
        Save()
    End Sub

    Public Function CanHandleCommand(ByVal command As ReportCommand, ByRef useNextHandler As Boolean) As Boolean Implements ICommandHandler.CanHandleCommand
        useNextHandler = Not (command = ReportCommand.SaveFile OrElse command = ReportCommand.SaveFileAs OrElse command = ReportCommand.Closing)
        Return Not useNextHandler
    End Function

    Private Sub Save()
        ' Write your custom method here.
        ' ...

        ' EXample:
        panel.Report.SaveLayout("report1.repx")

        ' Prevent the "Report has been changed" dialog from being shown.
        panel.ReportState = ReportState.Saved
    End Sub
End Class
vb
Imports DevExpress.XtraReports.UserDesigner

Public Class OpenCommandHandler
    Implements ICommandHandler

    Public Sub New()
    End Sub

    Public Sub HandleCommand(ByVal command As ReportCommand, ByVal args() As Object) Implements ICommandHandler.HandleCommand
        Select Case command
            Case ReportCommand.OpenFile
                Open()
        End Select
    End Sub

    Public Function CanHandleCommand(ByVal command As ReportCommand, ByRef useNextHandler As Boolean) As Boolean Implements ICommandHandler.CanHandleCommand
        useNextHandler = Not (command = ReportCommand.OpenFile)
        Return Not useNextHandler
    End Function

    Private Sub Open()
        MessageBox.Show("Open")
    End Sub
End Class

For information on how to customize the WinForms End-User Report Designer, review the following help topic: WinForms End-User Report Designer API and Customization.

See Also

Execute Commands in the End-User Report Designer

Hide Commands from the End-User Report Designer