This example performs the following steps to register object types for the Object Data Source Wizard, which allows users to create an Object Data Source:
- Declares the DataSource and DataSource2 classes that should provide data to reports. The DisplayName attribute is applied to the DataSource class to specify a custom display name for the Report Wizard and Data Source Wizard. The class's name and namespace are used for the DataSource2 class.
- Implements the IObjectDataSourceWizardTypeProvider interface to list data types.
- Implements the IObjectDataSourceConstructorFilterService interface to list only specific data type constructors in the Report Wizard and Data Source Wizard.
- Implements the IObjectDataSourceMemberFilterService interface to list only specific data members in the Report Wizard and Data Source Wizard.
- The RegisterObjectDataSourceWizardTypeProvider, RegisterObjectDataSourceConstructorFilterService and RegisterObjectDataSourceMemberFilterService methods are called at the application's startup to register the interface implementations.
Files to Review
ASP.NET WebForms:
- ObjectDataSource/SampleObjectTypes.cs
- Services/CustomObjectDataSourceWizardTypeProvider.cs
- Global.asax.cs
ASP.NET MVC:
- ObjectDataSource/SampleObjectTypes.cs
- Services/CustomObjectDataSourceWizardTypeProvider.cs
- Global.asax.cs
ASP.NET Core:
- ObjectDataSource/SampleObjectTypes.cs
- Services/CustomObjectDataSourceWizardTypeProvider.cs
- Startup.cs
Documentation
- Register Types for Object Data Source Wizard (ASP.NET WebForms)
- Register Types for Object Data Source Wizard (ASP.NET MVC)
- Register Types for Object Data Source Wizard (ASP.NET Core)
Does this example address your development requirements/objectives?
(you will be redirected to DevExpress.com to submit your response)
Example Code
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace WebForms.SampleObjectTypes {
[DisplayName("My Data Source")]
public class DataSource {
List<DataItem> data = new List<DataItem>();
public DataSource() : this(100) { }
public DataSource(int count) : this(count, 1000) { }
public DataSource(int count, int maxValue) {
var random = new Random();
for(var i = 0; i < count; i++) {
data.Add(new DataItem() {
Random = random.Next(0, maxValue)
});
}
}
public List<DataItem> GetData() {
return data;
}
public List<DataItem> GetData(int count) {
return data.GetRange(0, count);
}
}
public class DataSource2 : DataSource {
public DataSource2() : base(1000, 1000) { }
}
public class DataItem {
public int Random { get; set; }
}
}
C##region usings_1
using System;
using System.Collections.Generic;
#endregion
#region usings_2
using System.Linq;
using System.Reflection;
#endregion
#region usings
using DevExpress.DataAccess.Web;
#endregion
namespace WebForms.Services {
#region CustomObjectDataSourceWizardTypeProvider
// ...
public class CustomObjectDataSourceWizardTypeProvider : IObjectDataSourceWizardTypeProvider {
public IEnumerable<Type> GetAvailableTypes(string context) {
return new[] {
typeof(SampleObjectTypes.DataSource),
typeof(SampleObjectTypes.DataSource2)
};
}
}
#endregion
#region CustomObjectDataSourceConstructorFilterService
// ...
public class CustomObjectDataSourceConstructorFilterService : IObjectDataSourceConstructorFilterService {
public IEnumerable<ConstructorInfo> Filter(Type dataSourceType, IEnumerable<ConstructorInfo> constructors) {
if(dataSourceType == typeof(SampleObjectTypes.DataSource2)) {
return constructors;
}
return constructors.Where(x => x.GetParameters().Length > 0);
}
}
#endregion
#region CustomObjectDataSourceMemberFilterService
// ...
public class CustomObjectDataSourceMemberFilterService : IObjectDataSourceMemberFilterService {
public IEnumerable<MemberInfo> Filter(Type dataSourceType, IEnumerable<MemberInfo> members) {
if(dataSourceType == typeof(SampleObjectTypes.DataSource2)) {
return members;
}
return members.Where(x => {
var method = x as MethodInfo;
if(method != null) return method.GetParameters().Length > 0;
return false;
});
}
}
#endregion
}
C#using System;
using DevExpress.XtraReports.Web;
using WebForms.SampleObjectTypes;
using WebForms.Services;
namespace WebForms {
public class Global_asax : System.Web.HttpApplication {
void Application_Start(object sender, EventArgs e) {
System.Web.Routing.RouteTable.Routes.MapPageRoute("defaultRoute", "", "~/Default.aspx");
DevExpress.XtraReports.Configuration.Settings.Default.UserDesignerOptions.DataBindingMode = DevExpress.XtraReports.UI.DataBindingMode.Expressions;
DevExpress.XtraReports.Web.WebDocumentViewer.Native.WebDocumentViewerBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.QueryBuilder.Native.QueryBuilderBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.ReportDesigner.Native.ReportDesignerBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.Extensions.ReportStorageWebExtension.RegisterExtensionGlobal(new ReportStorageWebExtension1(Server.MapPath("/Reports")));
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceConstructorFilterService<CustomObjectDataSourceConstructorFilterService>();
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceMemberFilterService<CustomObjectDataSourceMemberFilterService>();
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceWizardTypeProvider<CustomObjectDataSourceWizardTypeProvider>();
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource));
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource2));
ASPxReportDesigner.StaticInitialize();
DevExpress.Web.ASPxWebControl.CallbackError += new EventHandler(Application_Error);
}
void Application_End(object sender, EventArgs e) {
// Code that runs on application shutdown
}
void Application_Error(object sender, EventArgs e) {
// Code that runs when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e) {
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e) {
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}
}
}
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace MVC.SampleObjectTypes {
[DisplayName("My Data Source")]
public class DataSource {
List<DataItem> data = new List<DataItem>();
public DataSource() : this(100) { }
public DataSource(int count) : this(count, 1000) { }
public DataSource(int count, int maxValue) {
var random = new Random();
for(var i = 0; i < count; i++) {
data.Add(new DataItem() {
Random = random.Next(0, maxValue)
});
}
}
public List<DataItem> GetData() {
return data;
}
public List<DataItem> GetData(int count) {
return data.GetRange(0, count);
}
}
public class DataSource2 : DataSource {
public DataSource2(): base(1000, 1000) { }
}
public class DataItem {
public int Random { get; set; }
}
}
C##region usings_1
using System;
using System.Collections.Generic;
#endregion
#region usings_2
using System.Linq;
using System.Reflection;
#endregion
#region usings
using DevExpress.DataAccess.Web;
#endregion
namespace MVC.Services {
#region CustomObjectDataSourceWizardTypeProvider
// ...
public class CustomObjectDataSourceWizardTypeProvider : IObjectDataSourceWizardTypeProvider {
public IEnumerable<Type> GetAvailableTypes(string context) {
return new[] {
typeof(SampleObjectTypes.DataSource),
typeof(SampleObjectTypes.DataSource2)
};
}
}
#endregion
#region CustomObjectDataSourceConstructorFilterService
// ...
public class CustomObjectDataSourceConstructorFilterService : IObjectDataSourceConstructorFilterService {
public IEnumerable<ConstructorInfo> Filter(Type dataSourceType, IEnumerable<ConstructorInfo> constructors) {
if(dataSourceType == typeof(SampleObjectTypes.DataSource2)) {
return constructors;
}
return constructors.Where(x => x.GetParameters().Length > 0);
}
}
#endregion
#region CustomObjectDataSourceMemberFilterService
// ...
public class CustomObjectDataSourceMemberFilterService : IObjectDataSourceMemberFilterService {
public IEnumerable<MemberInfo> Filter(Type dataSourceType, IEnumerable<MemberInfo> members) {
if(dataSourceType == typeof(SampleObjectTypes.DataSource2)) {
return members;
}
return members.Where(x => {
var method = x as MethodInfo;
if(method != null) return method.GetParameters().Length > 0;
return false;
});
}
}
#endregion
}
C#using System;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
using DevExpress.Web.Mvc;
using MVC.Services;
namespace MVC {
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
DevExpress.XtraReports.Configuration.Settings.Default.UserDesignerOptions.DataBindingMode = DevExpress.XtraReports.UI.DataBindingMode.Expressions;
DevExpress.XtraReports.Web.WebDocumentViewer.Native.WebDocumentViewerBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.QueryBuilder.Native.QueryBuilderBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.ReportDesigner.Native.ReportDesignerBootstrapper.SessionState = System.Web.SessionState.SessionStateBehavior.Default;
DevExpress.XtraReports.Web.Extensions.ReportStorageWebExtension.RegisterExtensionGlobal(new ReportStorageWebExtension1(Server.MapPath("/Reports")));
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceConstructorFilterService<CustomObjectDataSourceConstructorFilterService>();
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceMemberFilterService<CustomObjectDataSourceMemberFilterService>();
DevExpress.XtraReports.Web.ReportDesigner.DefaultReportDesignerContainer.RegisterObjectDataSourceWizardTypeProvider<CustomObjectDataSourceWizardTypeProvider>();
MVCxReportDesigner.StaticInitialize();
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource));
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource2));
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new DevExpress.Web.Mvc.DevExpressEditorsBinder();
DevExpress.Web.ASPxWebControl.CallbackError += Application_Error;
}
protected void Application_Error(object sender, EventArgs e) {
Exception exception = System.Web.HttpContext.Current.Server.GetLastError();
//TODO: Handle Exception
}
}
}
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace ASPNetCore.SampleObjectTypes {
[DisplayName("My Data Source")]
public class DataSource {
List<DataItem> data = new List<DataItem>();
public DataSource() : this(100) { }
public DataSource(int count) : this(count, 1000) { }
public DataSource(int count, int maxValue) {
var random = new Random();
for(var i = 0; i < count; i++) {
data.Add(new DataItem() {
Random = random.Next(0, maxValue)
});
}
}
public List<DataItem> GetData() {
return data;
}
public List<DataItem> GetData(int count) {
return data.GetRange(0, count);
}
}
public class DataSource2 : DataSource {
public DataSource2() : base(1000, 1000) { }
}
public class DataItem {
public int Random { get; set; }
}
}
C##region usings_1
using System;
using System.Collections.Generic;
#endregion
#region usings_2
using System.Linq;
using System.Reflection;
#endregion
#region usings
using DevExpress.DataAccess.Web;
#endregion
namespace ASPNetCore.Services {
#region CustomObjectDataSourceWizardTypeProvider
// ...
public class CustomObjectDataSourceWizardTypeProvider : IObjectDataSourceWizardTypeProvider {
public IEnumerable<Type> GetAvailableTypes(string context) {
return new[] {
typeof(ASPNetCore.SampleObjectTypes.DataSource),
typeof(ASPNetCore.SampleObjectTypes.DataSource2)
};
}
}
#endregion
#region CustomObjectDataSourceConstructorFilterService
// ...
public class CustomObjectDataSourceConstructorFilterService : IObjectDataSourceConstructorFilterService {
public IEnumerable<ConstructorInfo> Filter(Type dataSourceType, IEnumerable<ConstructorInfo> constructors) {
if(dataSourceType == typeof(ASPNetCore.SampleObjectTypes.DataSource2)) {
return constructors;
}
return constructors.Where(x => x.GetParameters().Length > 0);
}
}
#endregion
#region CustomObjectDataSourceMemberFilterService
// ...
public class CustomObjectDataSourceMemberFilterService : IObjectDataSourceMemberFilterService {
public IEnumerable<MemberInfo> Filter(Type dataSourceType, IEnumerable<MemberInfo> members) {
if(dataSourceType == typeof(ASPNetCore.SampleObjectTypes.DataSource2)) {
return members;
}
return members.Where(x => {
var method = x as MethodInfo;
if(method != null) return method.GetParameters().Length > 0;
return false;
});
}
}
#endregion
}
C#using System;
using System.IO;
using DevExpress.AspNetCore;
using DevExpress.AspNetCore.Reporting;
using DevExpress.DataAccess.Excel;
using DevExpress.DataAccess.Sql;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using DevExpress.XtraReports.Web.Extensions;
using DevExpress.DataAccess.Web;
using ASPNetCore.Services;
using Microsoft.Extensions.Hosting;
using ASPNetCore.SampleObjectTypes;
namespace ASPNetCore {
public class Startup {
public Startup(IConfiguration configuration, IWebHostEnvironment hostingEnvironment) {
Configuration = configuration;
FileProvider = hostingEnvironment.ContentRootFileProvider;
}
public IFileProvider FileProvider { get; }
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
services.AddDevExpressControls();
services.AddSession();
services.AddScoped<ReportStorageWebExtension, ReportStorageWebExtension1>();
services.AddControllersWithViews();
services.ConfigureReportingServices(configurator => {
configurator.ConfigureReportDesigner(designerConfigurator => {
designerConfigurator.RegisterObjectDataSourceConstructorFilterService<CustomObjectDataSourceConstructorFilterService>();
designerConfigurator.RegisterObjectDataSourceMemberFilterService<CustomObjectDataSourceMemberFilterService>();
designerConfigurator.RegisterObjectDataSourceWizardTypeProvider<CustomObjectDataSourceWizardTypeProvider>();
});
configurator.ConfigureWebDocumentViewer(viewerConfigurator => {
viewerConfigurator.UseCachedReportSourceBuilder();
});
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) {
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource));
DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(DataSource2));
DevExpress.XtraReports.Configuration.Settings.Default.UserDesignerOptions.DataBindingMode = DevExpress.XtraReports.UI.DataBindingMode.Expressions;
app.UseSession();
app.UseDevExpressControls();
if(env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions {
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "node_modules")),
RequestPath = "/node_modules"
});
app.UseRouting();
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}