彩票走势图

MindFusion.Reporting for WinForms程序员指南:报表编辑器控件介绍

翻译|使用教程|编辑:杨鹏连|2021-02-20 10:24:42.417|阅读 253 次

概述:该ReportEditor控件可用于创建、打开、保存、预览和打印MindFusion.Reporting报表。它可以集成在任何WinForms应用程序中,并为其提供编辑报表的能力。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

MindFusion.Reporting for WinForms是一个原生的Windows Forms编程组件,它为任何.NET应用程序提供专业的报表功能。该组件完全使用C#语言编写,易于使用和集成。它提供您创建一个完美报表所需要的一切。MindFusion.Reporting for WinForms现已加入在线订购,Standard Single Developer版本原价2848现在抢购立享优惠只需2345,立即查看详情>>

点击下载MindFusion.Reporting for WinForms最新试用版

该ReportEditor控件可用于创建、打开、保存、预览和打印MindFusion.Reporting报表。它可以集成在任何WinForms应用程序中,并为其提供编辑报表的能力。这对于全规模的报表应用程序以及较小的应用程序来说是非常有用的,它可以让最终用户在可视化的环境中修改现有的报表。例如,托管ReportEditor控件的应用程序可用于允许最终用户根据其需求调整预先存在的报表模板。
注释说明
ReportEditor类位于MindFusion.Reporting.Editor.dll集合中。
注意事项
使用报表编辑器的应用程序的最低要求 "目标框架 "是".NET框架4"。

编辑器组件

该编辑器由四个主要组件组成--设计器区域、属性网格、工具箱和预览面板。下图展示了ReportEditor控件的默认外观。

设计器区域位于中间,属性网格和工具箱分别位于左边和右边。预览面板可以通过控件底部的标签切换到。所有这些组件都可以分别通过ShowPropertiesWindow、ShowToolboxWindow和ShowPreview属性进行隐藏。要在 "设计 "和 "预览 "选项卡之间进行编程切换,请使用ActiveTabPage属性。

使用编辑器

用户体验

由于ReportEditor控件是基于在Visual Studio中实现MindFusion.Reporting报表设计时支持的相同组件和服务,因此从用户的角度来看,使用ReportEditor控件创建报表和在Visual Studio中创建报表几乎是相同的。要了解如何交互式设计报表的基础知识,请查看报表设计器主题。创建、打开和保存报表

编辑器内显示的报表实例可以通过报表属性进行访问。注意,这个属性是只读的。正因为如此,要打开一个现有的报表进行编辑,首先要使用它的SaveToXml方法保存报表,然后通过OpenReport方法在编辑器里面打开报表。直接通过调用Report本身的LoadFromXml打开报表是不可取的。更为一般的是,以任何方式对编辑后的报表进行程序修改都需要谨慎。请查看本主题末尾的 "以编程方式修改已编辑的报表 "部分,了解如何进行修改的提示。

要创建新报表或保存当前报表,分别使用NewReport和SaveReport方法。要检查当前报表是否在打开或最后保存后被修改,请使用IsReportDirty属性。每当通过编辑器更改、打开或保存报表时,这个属性都会自动更新。

命令

编辑器支持各种标准菜单命令,可以通过InvokeCommand方法调用。例如,要对齐当前在编辑器中选择的报表项的左侧,使用以下代码调用标准命令AlignLeft。
C#

reportEditor.InvokeCommand(StandardCommands.Align);

Visual Basic

reportEditor.InvokeCommand(StandardCommands.Align)
另外,还可以通过MenuCommandService调用命令,该命令可以通过编辑器的GetService方法获得。

下表列出了编辑器支持的大部分标准菜单命令。

此外,编辑器还支持MenuCommands类的自定义菜单命令。

将UI元素与命令关联起来

报告编辑器提供了监听支持的命令变化的方法。当应用程序中的一个UI元素需要与一个特定的命令相关联时,这很有用。当命令未启用时,该元素需要自动灰化(或禁用)以表明这一点。例如,当Undo不可用时,应用程序中触发Undo命令的按钮应该被禁用。

要监听命令的变化,将一个实现ICommandListener接口的类的实例(以及相应命令的ID)传递给RegisterCommandListener方法。当具有指定ID的命令的状态发生变化时,通过其UpdateState方法通知指定的监听器。

ICommandListener接口的实现取决于需要更新的用户元素的类型。例如,让我们检查一个应用程序,它提供了一个ToolStripButton组件来触发各种命令。下面是这个应用程序的ICommandListener接口的一个示例实现。
C#

private class ToolStripItemCommandListener : ICommandListener
{
    public CommandListener(ToolStripItem item)
    {
        this.item = item;
    }
    public void UpdateState(bool enabled, bool visible)
    {
        item.Enabled = enabled;
        item.Visible = visible;
    }
    private ToolStripItem item;
}
Visual Basic
Private Class CommandListener
    Implements ICommandListener

    Public Sub New(item As ToolStripItem)
        Me.item = item
    End Sub

    Public Sub UpdateState(enabled As Boolean, visible As Boolean) Implements ICommandListener.UpdateState
        item.Enabled = enabled
        item.Visible = visible
    End Sub

    Private item As ToolStripItem

End Class
让我们假设 undoButton 是应用程序中现有的 ToolStripButton,它应该触发 Undo 命令。那么下面的代码将把 undoButton 与 Undo 命令关联起来。
C#
reportEditor.RegisterCommandListener(StandardCommands.Undo, new CommandListener(undoButton));
Visual Basic
reportEditor.RegisterCommandListener(StandardCommands.Undo, New CommandListener(undoButton))
现在,当Undo可用时,按钮将被启用,当Undo不可用时,按钮将被禁用。

注册数据源

数据源代表报表元素可以绑定的数据对象。任何对象都可以作为数据源,包括DataSet、业务对象的数组、自定义对象等。数据源可以通过AddDataSource重载之一添加到编辑器中。新添加的数据源会以组件的形式出现在设计器区域底部的小托盘窗口中,随后可以在属性网格内选择数据源作为DataRange和Chart报表项的数据源。在编辑器中添加数据源并不会导致编辑的报表变脏,也不会以任何方式改变报表,直到数据源真正被选为报表项的DataSource。创建新报表(通过NewReport)或关闭当前报表(通过CloseReport)不会导致注册的数据源消失。

当一个数据源被添加到编辑器中时,它将与一个唯一的名称相关联。该名称在保存报表时被序列化,并在反序列化过程中用于识别项目所绑定的数据源。数据源的名称可以通过使用 AddDataSource overload 显式指定,也可以通过使用 AddDataSource overload 由编辑器自动生成。这两个重载都会返回一个IComponent对象,它是编辑器内部代表数据源的组件。在编辑器自动生成数据源名称的情况下,这个名称可以通过返回对象的IComponent.Site.Name属性获得。

DataRange对象可以从注册的数据源中自动创建。要做到这一点,请在设计器区域内的页面上点击右键,并在上下文菜单中选择 "Create DataRange from Data Source... "项。这将显示一个对话框,里面有所有注册的数据源和它们的字段或属性。用户可以选择要包含在生成的DataRange中的成员。

以编程方式修改报表

编辑后的报表不应直接修改。更具体地说,不应该通过构造函数创建新的项目并添加到报表或项目容器中,也不应该通过属性分配删除或修改现有项目。直接修改不会被撤销引擎跟踪,不会自动更新设计器表面和UI元素,而且往往会引起异常。例如,不建议进行以下修改。
C#

reportEditor.Report.Pages.Add(new Page())。
reportEditor.Report.Pages[0].Items[0].Location = new Location(10, 10);
reportEditor.Report.Pages.RemoveAt(0);
Visual Basic
reportEditor.Report.Pages.Add(New Page())
reportEditor.Report.Pages[0].Items[0].Location = New Location(10, 10)
reportEditor.Report.Pages.RemoveAt(0)
创建项目

新项目应该通过IDesignerHost服务来创建。可以通过调用GetService方法从编辑器中获得对该服务的引用。下面的代码说明了如何创建一个新的页面。
C#

IDesignerHost designerHost = reportEditor.GetService<IDesignerHost>();
Page newPage = designerHost.CreateComponent(typeof(Page)) as Page.CreateComponent(typeof(Page));
Visual Basic
Dim designerHost As IDesignerHost = reportEditor.GetService(Of IDesignerHost)()
Dim newPage As Page = CType(designerHost.CreateComponent(GetType(Page)), Page)
添加项目

向容器中添加新的项目应该通过调用IComponentChangeService的OnComponentChanging和OnComponentChanged方法来包装。这个服务的引用也可以通过GetService方法获得。下面的代码说明了如何将之前创建的页面实例添加到报表中。
C#

IComponentChangeService componentChange = reportEditor.GetService<IComponentChangeService>();
componentChange.OnComponentChanging(reportEditor.Report, null);
reportEditor.Report.Pages.Add(newPage);
componentChange.OnComponentChanged(reportEditor.Report, null, null, null);
Visual Basic
Dim componentChange As IComponentChangeService = reportEditor.GetService(Of IComponentChangeService)()
componentChange.OnComponentChanging(reportEditor.Report, Nothing)
reportEditor.Report.Pages.Add(newPage)
componentChange.OnComponentChanged(reportEditor.Report, Nothing, Nothing, Nothing);
修改项目
可以通过在OnComponentChanging/OnComponentChanged块中封装属性分配来修改项目,类似于添加项目的方式。另外,也可以通过PropertyDescriptor对象来修改项目。下面的代码演示了如何使用第二种方法来改变现有项的位置。
C#
PropertyDescriptor locationProperty = TypeDescriptor.GetProperties(item)["Location"];
locationProperty.SetValue(item, new Location(0, 0));
Visual Basic
Dim locationProperty As PropertyDescriptor = TypeDescriptor.GetProperties(item)("Location")
locationProperty.SetValue(item, New Location(0, 0))
移除项目
项目被删除的方式与它们被添加的方式类似。删除的项目也需要通过IDesignerHost服务的DestroyComponent方法进行销毁。下面的代码段删除了已编辑的报表的第一页。
C#
IDesignerHost designerHost = reportEditor.GetService<IDesignerHost>()。
IComponentChangeService componentChange = reportEditor.GetService<IComponentChangeService>();
componentChange.OnComponentChanging(reportEditor.Report, null);
page removedPage = reportEditor.Report.Pages[0];
reportEditor.Report.Pages.RemoveAt(0);
componentChange.OnComponentChanged(reportEditor.Report, null, null, null);
designerHost.DestroyComponent(removementPage);
Visual Basic
Dim designerHost As IDesignerHost = reportEditor.GetService(Of IDesignerHost)()
Dim componentChange As IComponentChangeService = reportEditor.GetService(Of IComponentChangeService)()
componentChange.OnComponentChanging(reportEditor.Report, Nothing)
Dim removedPage as Page = reportEditor.Report.Pages(0)
reportEditor.Report.Pages.RemoveAt(0)
componentChange.OnComponentChanged(reportEditor.Report, Nothing, Nothing, Nothing)
designerHost.DestroyComponent(removementPage)
备注 
请记住,报告至少要有一页。删除报表的最后一页将导致一个异常。

使用事务

对报告的每一次修改都会在撤销历史记录中产生一条撤销记录。由于各种间接的修改,如新创建对象的属性初始化,有些修改甚至会产生不止一条记录。为了将多个修改打包成一条撤销记录,可以在一个事务中执行。下面的例子是在一个事务内部修改一个现有项目的位置和大小。
C#

IDesignerHost designerHost = reportEditor.GetService<IDesignerHost>();
使用(DesignerTransaction transaction = designerHost.CreateTransaction("修改项目"))
{
    PropertyDescriptor locationProperty = TypeDescriptor.GetProperties(item)["Location"];
    locationProperty.SetValue(item, new Location(0, 0));
    PropertyDescriptor sizeProperty = TypeDescriptor.GetProperties(item)["Size"];
    sizeProperty.SetValue(item, new Dimension(20, 20));
    transaction.Commit();
}
Visual Basic
Dim designerHost As IDesignerHost = reportEditor.GetService(Of IDesignerHost)()
Using transaction As DesignerTransaction = designerHost.CreateTransaction("Modifying item")

    Dim locationProperty As PropertyDescriptor = TypeDescriptor.GetProperties(item)("Location")
    locationProperty.SetValue(item, New Location(0, 0))
    Dim sizeProperty As PropertyDescriptor = TypeDescriptor.GetProperties(item)("Size")
    sizeProperty.SetValue(item, New Dimension(20, 20))
    transaction.Commit()

End Using
也可以嵌套交易。


想要购买该产品正版授权请点击【商城购买】,想了解更多产品信息请点击


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP