EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:自定义导出按钮行为

在XAF WinForms和ASP.NET应用程序中,可以使用内置ExportController提供的Export Action导出列表视图中的数据。如果实现IExportable接口的列表编辑器显示当前的列表视图,则默认情况下将激活此操作。当前,所有内置的WinForms列表编辑器和大多数ASP.NET列表编辑器都支持此接口(不包括内置的“移动列表”编辑器)。该行动的ChoiceActionBase.Items集是基于填充IExportable.SupportedExportFormats当前列表视图的列表编辑器的集合。

您可以使用ExportController的事件来自定义此Action的行为。请注意,有两个ExportController后代:WinExportController用于WinForms应用程序中,将数据导出到文件流中,并在导出之前调用“保存文件”对话框;并且WebExportController在ASP.NET应用程序和数据导出到内存流使用。

自定义导出功能时,请确保所做的更改是针对基础控制器或特定于平台的控制器的。在本主题中,在WinForms和ASP.NET应用程序中,都针对Export Action定制处理ExportController.CustomGetDefaultFileNameExportController.CustomExportExportController.Exported事件。

以下各节介绍如何通过处理Controller事件来访问ExportController并自定义Export Action行为。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E2335)中提供了完整的示例项目。

自定义用于导出数据的文件的名称

在WinForms应用程序中,在将数据导出到文件之前,将调用“保存文件”对话框。在此对话框中,指定了默认文件名。它是从当前从中导出数据的列表视图的标题生成的。在ASP.NET应用程序中,数据将导出到“内存流”中,可以将其下载为文件。该文件的默认名称的生成方式与WinForms应用程序中的生成方式相同。订阅ExportController.CustomGetDefaultFileName事件以自定义此文件名。与平台无关的基本ExportController类公开此事件。因此,您在此事件的处理程序中提供的文件名将在WinForms和ASP.NET应用程序中使用。以下代码演示了如何访问ExportController 并处理其事件:

using DevExpress.ExpressApp.SystemModule;
//...
public partial class CustomizeExportController : ViewController {
    public CustomizeExportController() {
        InitializeComponent();
        TargetViewType = ViewType.ListView;
    }
    private ExportController exportController;
    protected override void OnActivated() {
         base.OnActivated();
         exportController = Frame.GetController<ExportController>();
         if (exportController != null) {
             exportController.CustomGetDefaultFileName  = exportController_CustomGetDefaultFileName;
         }
    }
    void exportController_CustomGetDefaultFileName(
        object sender, CustomGetDefaultFileNameEventArgs e) {
        //Provide a custom file name
        e.FileName = e.FileName   "_"   DateTime.Now.ToString("MM.dd.yy");
    }
    protected override void OnDeactivated() {
         if (exportController != null) {
             exportController.CustomGetDefaultFileName -= exportController_CustomGetDefaultFileName;
         }
        base.OnDeactivated();
    }
}

下图说明了在CustomGetDefaultFileName事件处理程序中指定的名称用作导出文件的默认名称:

CustomExport_FileName

如果仅需要自定义WinForms或ASP.NET应用程序的默认文件名,请分别访问WinExportControllerWebExportController。这些控制器是ExportController的后代-它们也公开CustomGetDefaultFileName事件。

使用CustomExport事件为WinForms和ASP.NET应用程序自定义导出选项

您可以使用ExportOptionsBase类后代自定义为目标导出格式指定的导出选项。为此,请订阅ExportController.CustomExport事件,并使用处理程序的CustomExportEventArgs.ExportOptions参数来访问它们。如果需要同时更改WinForms和ASP.NET应用程序的选项,请订阅ExportControllerCustomExport事件。使用处理程序的CustomExportEventArgs.ExportTarget参数来获取导出操作中当前使用的导出格式。例如,您可以更改XSL导出选项,如下所示。

using DevExpress.ExpressApp.SystemModule;
using DevExpress.XtraPrinting;
// ...
public partial class CustomizeExportController : ViewController {
    public CustomizeExportController() {
        InitializeComponent();
        TargetViewType = ViewType.ListView;
    }
    private ExportController exportController;
    protected override void OnActivated() {
        base.OnActivated();
        exportController = Frame.GetController<ExportController>();
        exportController.CustomExport  = CustomExport;
    }
    protected virtual void CustomExport(object sender, CustomExportEventArgs e) {
        //Customize Export Options
        if (e.ExportTarget == ExportTarget.Xls) {
            XlsExportOptions options = e.ExportOptions as XlsExportOptions;
            if (options == null) {
               options = new XlsExportOptions();
            }
            options.SheetName = View.Caption;
            options.ShowGridLines = true;
            e.ExportOptions = options;
        }
    }
    protected override void OnDeactivated() {
        exportController.CustomExport -= new EventHandler<CustomExportEventArgs>(CustomExport);
        base.OnDeactivated();
    }
}

在上面的代码中,导出的View的标题用作导出的XLS文件中工作表的名称。

出口_6

如果仅需要自定义WinForms或ASP.NET应用程序中的导出选项,请分别访问WinExportControllerWebExportController。这些控制器是ExportController的后代,它们还公开CustomExport事件。

您可以使用XlsExportOptionsEx类成员自定义导出选项,以替代XlsExportOptions成员。

使用WinForms应用程序的CustomExport事件自定义导出选项

本节演示如何自定义特定于特定导出格式的导出选项,例如内置WinForms列表编辑器控件提供的导出选项。订阅CustomExport事件,并使用事件处理程序的CustomExportEventArgs.Printable参数访问这些控件。例如,当从TreeListEditor导出数据时,Printable参数提供对TreeList控件的访问。此控件的TreeList.OptionsPrint属性使您可以设置所需的导出选项。

GridListEditor中GridControl用于导出数据。使用GridView的GridView.OptionsPrint属性访问GridControl的导出选项。

下面的代码演示了如何使用GridOptionsPrint.ExpandAllGroups通过GridView的返回的对象的属性OptionsPrint财产。

GridListEditor提供列表视图时,可以对数据行进行分组,并且可以折叠组。在该导出操作的默认行为是要扩大在所有导出的文件中倒塌组。您可以在GridListEditor折叠组时调用一条消息以通知最终用户,然后询问是否将其折叠在导出文件中。处理ExportController.CustomExport事件以执行此操作。

有必要遍历网格组行以检测折叠的组。组行在“网格视图”中具有否定句柄(请参阅在代码中使用组)。可以通过GridView.GetRowExpanded方法确定组行的扩展状态。当检测到折叠组时,使用Messaging.GetUserChoice方法显示消息框,并根据用户的选择设置GridOptionsPrint.ExpandAllGroups属性。

在WinForms模块中实现一个Controller,以更改WinForms应用程序中使用的网格控件的ExpandAllGroups导出选项。在此Controller中,访问WinExportController订阅其CustomExport事件。

using DevExpress.XtraGrid.Views.Grid;
using DevExpress.ExpressApp.Win.SystemModule;
using DevExpress.ExpressApp.Win.Editors;
using DevExpress.ExpressApp.Win;
using System.Windows.Forms;
// ...
public partial class CustomizeExportControllerWin : ViewController {
     public CustomizeExportControllerWin() {
        InitializeComponent();
        TargetViewType = ViewType.ListView;
    }
    private WinExportController winExportController;
    protected override void OnActivated() {
        base.OnActivated();
        winExportController = Frame.GetController<WinExportController>();
        winExportController.CustomExport  = winExportController_CustomExport;
    }
    void winExportController_CustomExport(object sender, CustomExportEventArgs e) {
        //Show a message before exporting a Grid List Editor
        GridListEditor gridListEditor = 
            ((DevExpress.ExpressApp.ListView)View).Editor as GridListEditor;
        if (gridListEditor != null) {
            GridView gridView = gridListEditor.GridView;
            if (HasCollapsedGroups(gridView)) {
                string message =
                   "There are collapsed groups in the grid. "  
                    "Expand all groups in the exported file?";
                gridView.OptionsPrint.ExpandAllGroups =
                   WinApplication.Messaging.GetUserChoice(message, GetMessageBoxCaption(),
                   MessageBoxButtons.YesNo)
                   == DialogResult.Yes;
            }
        }
    }
    private bool HasCollapsedGroups(GridView gridView) {
        if (gridView.GroupCount > 0) {
            int rowHandle = -1;
            while (gridView.IsValidRowHandle(rowHandle)) {
                if (!gridView.GetRowExpanded(rowHandle)) return true;
                rowHandle--;
            }
        }
        return false;
    }
    private string GetMessageBoxCaption() {
        return String.Format(
            "{0} {1}", winExportController.ExportAction.Caption,
                winExportController.ExportAction.SelectedItem);
    }
    protected override void OnDeactivated() {
        winExportController.CustomExport -= winExportController_CustomExport;
        base.OnDeactivated();
    }
}

最终用户在导出包含折叠组的列表视图时将看到以下消息框:

导出_2

注意

请参阅“如何:本地化自定义字符串常量”主题,以了解如何使此消息文本可本地化。

如果选择“是”,则将导出所有网格行。

出口_4

如果选择“否”,则属于折叠组的行将不包含在导出文件中。

出口_3

使用CustomExport事件为ASP.NET应用程序自定义导出选项

在ASP.NET应用程序中,用于从列表编辑器导出数据的控件是所谓的导出器。您可以使用它们来更改默认导出设置。订阅ExportController.CustomExport事件,并使用事件处理程序的CustomExportEventArgs.Printable参数来访问当前导出的列表编辑器的导出器。例如,当从ASPxGridListEditor导出数据时,Printable参数提供对ASPxGridViewExporter导出器的访问。

下面的代码演示了如何使用ASPxGridViewExporterASPxGridViewExporter.ExportSelectedRowsOnly属性。将此属性设置为true值以仅导出在导出的网格中当前选定的行。

在Web模块中实现一个Controller,以使用ASPxGridListEditor在ASP.NET应用程序中使用的ASPxGridViewExporter导出选项。在此Controller中,访问WebExportController订阅其CustomExport事件。

using DevExpress.ExpressApp.Web.SystemModule;
//add a reference to the DevExpress.Web.Export assembly
using DevExpress.Web;
// ...
public partial class CustomizeExportControllerWeb : ViewController {
    public CustomizeExportControllerWeb() {
        InitializeComponent();
        TargetViewType = ViewType.ListView;
    }
    private WebExportController webExportController;
    protected override void OnActivated() {
        base.OnActivated();
        webExportController = Frame.GetController<WebExportController>();
        webExportController.CustomExport  = webExportController_CustomExport;
    }
    void webExportController_CustomExport(object sender, CustomExportEventArgs e) {
        //Export only selected rows
        ASPxGridViewExporter exporter = e.Printable as ASPxGridViewExporter;
        if (exporter != null) {
            exporter.ExportSelectedRowsOnly = true;
        }
    }
    protected override void OnDeactivated() {
        webExportController.CustomExport -= webExportController_CustomExport;
        base.OnDeactivated();
    }
}

使用上面的代码,“导出操作”仅导出选定的网格行:

CustomExport_SelectedRows

使用WinForms应用程序的Exported事件自定义Export Action行为

导出操作完成后,您可以询问最终用户是否应打开保存的文件。处理ExportController.Exported事件以执行此操作。处理程序的CustomExportEventArgs.Stream参数可用于确定导出的文件名。

using System.IO;
using DevExpress.ExpressApp.Win;
using System.Windows.Forms;
using DevExpress.ExpressApp.Win.SystemModule;
//...
public partial class CustomizeExportControllerWin : ViewController {
    // ...
    private WinExportController winExportController;
    protected override void OnActivated() {
        base.OnActivated();
        // ...
        winExportController.Exported  = 
            new EventHandler<CustomExportEventArgs>(winExportController_Exported);
    }
    void winExportController_Exported(object sender, 
            DevExpress.ExpressApp.SystemModule.CustomExportEventArgs e) {
        if (e.Stream is FileStream) {
            string fileName = ((FileStream)e.Stream).Name;
            if (File.Exists(fileName)) {
                e.Stream.Close();
                if (WinApplication.Messaging.GetUserChoice("Open the exported file?",
                        GetMessageBoxCaption(), MessageBoxButtons.YesNo) == DialogResult.Yes)
                    Process.Start(fileName);
            }
        }
    }
    protected override void OnDeactivated()  {
        winExportController.Exported -= 
            new EventHandler<CustomExportEventArgs>(winExportController_Exported);
        // ...
        base.OnDeactivated();
    }
}

下图说明了导出完成后显示的消息框。

出口_5

注意

请参阅“如何:本地化自定义字符串常量”主题以查看如何本地化消息文本。

如果最终用户单击“是”,则导出的文件将在与其类型相关联的应用程序中打开。

相关文章

转载保留此链接,注明出处