商信互联
本示例演示了如何在预览报表时指定用于编辑报表参数值的自定义控件。
移动应用程序不支持报告预览机制,因此本主题中描述的方法无法在移动平台中实现。
在本主题中,假定您有一个使用Reports V2 Module的XAF应用程序,并且已经创建了一个或多个报告(请参阅Reports V2 Module Overview)。
例如,假设您有一个带有TitleOfCourtesy类型的parameterTitle参数的报告。打开报表代码,并在报表的构造函数中指定Parameter.Type值。
public partial class XtraReport1 : DevExpress.XtraReports.UI.XtraReport {
public XtraReport1() {
InitializeComponent();
this.parameterTitle.Type = typeof(TitleOfCourtesy);
}
// ...
}
Partial Public Class XtraReport1
Inherits DevExpress.XtraReports.UI.XtraReport
Public Sub New()
InitializeComponent()
Me.parameterTitle.Type = GetType(TitleOfCourtesy)
End Sub
' ...
End Class
如果注册的类型不是标准的.NET类型(字符串,int等),并且不用于业务对象属性,则还必须使用如何:注册其他类型中所示的方法来注册该类型。 XtraReport参数主题。
要为Windows Forms应用程序中的标准类型的参数提供自定义编辑器,请处理XtraReport.ParametersRequestBeforeShow事件,然后将自定义编辑器分配给存储在ParametersRequestEventArgs.ParametersInformation集合中的ParameterInfo对象的ParameterInfo.Editor属性。要获取XtraReport实例,请处理ReportDataSourceHelper.BeforeShowPreview事件。
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.ReportsV2;
using DevExpress.XtraEditors;
using DevExpress.XtraReports.Parameters;
// ...
public class WinModule : ModuleBase {
public override void Setup(ApplicationModulesManager moduleManager) {
base.Setup(moduleManager);
ReportsModuleV2 module = ReportsModuleV2.FindReportsModule(moduleManager.Modules);
if(module != null) {
module.ReportsDataSourceHelper.BeforeShowPreview = ReportsDataSourceHelper_BeforeShowPreview;
}
}
private void ReportsDataSourceHelper_BeforeShowPreview(object sender, BeforeShowPreviewEventArgs e) {
e.Report.ParametersRequestBeforeShow = (s, arg) => {
foreach(ParameterInfo info in arg.ParametersInformation) {
if(info.Parameter.Name == "parameter1") {
LookUpEdit lookUpEdit = new LookUpEdit();
lookUpEdit.Properties.DataSource = new List<string>(new string[] { "One", "Two"});
info.Editor = lookUpEdit;
}
}
};
}
}
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.ReportsV2
Imports DevExpress.XtraEditors
Imports DevExpress.XtraReports.Parameters
' ...
Public Class WinModule
Inherits ModuleBase
Public Overrides Sub Setup(ByVal moduleManager As ApplicationModulesManager)
MyBase.Setup(moduleManager)
Dim [module] As ReportsModuleV2 = ReportsModuleV2.FindReportsModule(moduleManager.Modules)
If [module] IsNot Nothing Then
AddHandler [module].ReportsDataSourceHelper.BeforeShowPreview, AddressOf ReportsDataSourceHelper_BeforeShowPreview
End If
End Sub
Private Sub ReportsDataSourceHelper_BeforeShowPreview(ByVal sender As Object, ByVal e As BeforeShowPreviewEventArgs)
AddHandler e.Report.ParametersRequestBeforeShow, Sub(s, arg)
For Each info As ParameterInfo In arg.ParametersInformation
If info.Parameter.Name = "parameter1" Then
Dim lookUpEdit As New LookUpEdit()
lookUpEdit.Properties.DataSource = New List(Of String)(New String() { "One", "Two"})
info.Editor = lookUpEdit
End If
Next info
End Sub
End Sub
End Class
处理静态ReportsWindowsFormsModuleV2.CreateCustomReportDesignRepositoryItem事件,以指定用于预览报表时用于编辑参数值的自定义RepositoryItem。使用处理程序的CreateCustomReportDesignRepositoryItemEventArgs.RepositoryItem参数传递您的存储库项目,并将Handled参数设置为true。指定的控件将用于应用程序中的任何报告。
由于CreateCustomReportDesignRepositoryItem是静态的,这意味着您可以在WinForms项目中的任何位置访问它。例如,您可以在WinForms模块项目(在WinModule.cs(WinModule.vb)文件中)的重写的ModuleBase.Setup方法中订阅CreateCustomReportDesignRepositoryItem。
using DevExpress.XtraEditors.Repository;
using DevExpress.ExpressApp.ReportsV2.Win;
// ...
public override void Setup(XafApplication application) {
base.Setup(application);
ReportsWindowsFormsModuleV2.CreateCustomReportDesignRepositoryItem =
delegate(object sender, CreateCustomReportDesignRepositoryItemEventArgs e) {
if(e.Parameter.Name.Equals("parameterTitle")) {
RepositoryItemLookUpEdit item = new RepositoryItemLookUpEdit();
item.NullText = "[Select Title Of Courtesy]";
List<TitleOfCourtesy> st = new List<TitleOfCourtesy>();
st.Add(TitleOfCourtesy.Dr);
st.Add(TitleOfCourtesy.Mrs);
item.DataSource = st;
e.RepositoryItem = item;
e.Handled = true;
}
};
}
Imports DevExpress.XtraEditors.Repository
Imports DevExpress.ExpressApp.ReportsV2.Win
' ...
Public Overrides Sub Setup(ByVal application As XafApplication)
MyBase.Setup(application)
AddHandler ReportsWindowsFormsModuleV2.CreateCustomReportDesignRepositoryItem, Sub(sender As Object, e As CreateCustomReportDesignRepositoryItemEventArgs)
If e.Parameter.Name.Equals("parameterTitle") Then
Dim item As New RepositoryItemLookUpEdit()
item.NullText = "[Select Title Of Courtesy]"
Dim st As New List(Of TitleOfCourtesy)()
st.Add(TitleOfCourtesy.Dr)
st.Add(TitleOfCourtesy.Mrs)
item.DataSource = st
e.RepositoryItem = item
e.Handled = True
End If
End Sub
End Sub
当使用HTML5文档查看器预览报告时(ReportsAspNetModuleV2.ReportViewerType属性设置为HTML5),此方法适用。
在ASP.NET应用程序项目的Default.aspx文件中为参数编辑器定义一个自定义模板。(请参阅为报表参数提供自定义编辑器)
<script type ="text/html" id="catId-custom-editor">
<div data-bind="dxNumberBox: { value: value, showSpinButtons: true, min: 1, max: 8 }"> </div>
</script>
处理文档查看器的客户端实例的ASPxClientWebDocumentViewer.CustomizeParameterEditors事件。
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.ReportsV2.Web;
// ...
public class CustomizeReportViewerController : ViewController<DetailView> {
public CustomizeReportViewerController() {
TargetViewId = ReportsAspNetModuleV2.ReportViewDetailViewWebName;
}
protected override void OnActivated() {
base.OnActivated();
ReportWebViewerDetailItem reportViewItem = View.GetItems<ReportWebViewerDetailItem>()[0] as ReportWebViewerDetailItem;
reportViewItem.ControlCreated = delegate (object sender, EventArgs e) {
reportViewItem.ReportViewer.ClientSideEvents.CustomizeParameterEditors =
@"function(s, e) {
if (e.parameter.name == 'parameter1') {
e.info.editor = { header: 'catId-custom-editor' };
}
}";
};
}
}
Imports Microsoft.VisualBasic
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.ReportsV2.Web
' ...
Public Class CustomizeReportViewerController
Inherits ViewController(Of DetailView)
Public Sub New()
TargetViewId = ReportsAspNetModuleV2.ReportViewDetailViewWebName
End Sub
Protected Overrides Sub OnActivated()
MyBase.OnActivated()
Dim reportViewItem As ReportWebViewerDetailItem = TryCast(View.GetItems(Of ReportWebViewerDetailItem)()(0), ReportWebViewerDetailItem)
AddHandler reportViewItem.ControlCreated, Sub(sender As Object, e As EventArgs) reportViewItem.ReportViewer.ClientSideEvents.CustomizeParameterEditors = _
"function(s, e) { " & ControlChars.CrLf & _
"if (e.parameter.name == 'parameter1') {" & ControlChars.CrLf & _
" e.info.editor = { header: 'catId-custom-editor' };" & ControlChars.CrLf & _
" }" & ControlChars.CrLf & _
"}"
End Sub
End Class
当使用ASP.NET Document Viewer预览报告时(ReportsAspNetModuleV2.ReportViewerType属性设置为ASP),此方法适用。
在v19.1中,已弃用ASP.NET Document Viewer。我们建议您在应用程序中使用HTML5文档查看器。为此,请将ReportViewerType属性设置为HTML5。
在ASP.NET模块项目中创建一个View Controller。重写Controller的OnActivated方法,使用Frame.GetController <ControllerType>方法访问WebReportServiceController并订阅WebReportServiceController.CustomizeParameterEditors事件。将您的自定义控件传递到处理程序的CustomizeParameterEditorsEventArgs.Editor参数。指定的控件将用于应用程序中的任何报告。
using DevExpress.Web.ASPxEditors;
using DevExpress.XtraReports.Web;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.ReportsV2.Web;
// ...
public class CustomReportParametersEditorController : ViewController{
private WebReportServiceController controller;
protected override void OnActivated() {
base.OnActivated();
controller = Frame.GetController<WebReportServiceController>();
if (controller != null) {
controller.CustomizeParameterEditors = delegate(object sender,
CustomizeParameterEditorsEventArgs e) {
if(e.Parameter.Name.Equals("parameterTitle")) {
ASPxComboBox comboBox = new ASPxComboBox();
comboBox.Items.Add("Dr",TitleOfCourtesy.Dr);
comboBox.Items.Add("Mr",TitleOfCourtesy.Mr);
e.Editor = comboBox;
}
};
}
}
Imports DevExpress.Web.ASPxEditors
Imports DevExpress.XtraReports.Web
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.ReportsV2.Web
' ...
Public Class CustomReportParametersEditorController
Inherits ViewController
Private controller As WebReportServiceController
Protected Overrides Sub OnActivated()
MyBase.OnActivated()
controller = Frame.GetController(Of WebReportServiceController)()
If controller IsNot Nothing Then
AddHandler controller.CustomizeParameterEditors, Sub(sender As Object, e As CustomizeParameterEditorsEventArgs)
If e.Parameter.Name.Equals("parameterTitle") Then
Dim comboBox As New ASPxComboBox()
comboBox.Items.Add("Dr",TitleOfCourtesy.Dr)
comboBox.Items.Add("Mr",TitleOfCourtesy.Mr)
e.Editor = comboBox
End If
End Sub
End If
End Sub