Example T830402
Visible to All Users

Reporting for Web - Register Types for Object Data Source Wizard

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:

Files to Review

ASP.NET WebForms:

ASP.NET MVC:

ASP.NET Core:

Documentation

Does this example address your development requirements/objectives?

(you will be redirected to DevExpress.com to submit your response)

Example Code

WebForms/CS/ObjectDataSource/SampleObjectTypes.cs
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; } } }
WebForms/CS/Services/CustomObjectDataSourceWizardTypeProvider.cs
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 }
WebForms/CS/Global.asax.cs
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. } } }
MVC/CS/ObjectDataSource/SampleObjectTypes.cs
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; } } }
MVC/CS/Services/CustomObjectDataSourceWizardTypeProvider.cs
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 }
MVC/CS/Global.asax.cs
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 } } }
ASPNetCore/ASPNetCore/ObjectDataSource/SampleObjectTypes.cs
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; } } }
ASPNetCore/ASPNetCore/Services/CustomObjectDataSourceWizardTypeProvider.cs
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 }
ASPNetCore/ASPNetCore/Startup.cs
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?}"); }); } } }

Disclaimer: The information provided on DevExpress.com and affiliated web properties (including the DevExpress Support Center) is provided "as is" without warranty of any kind. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.

Confidential Information: Developer Express Inc does not wish to receive, will not act to procure, nor will it solicit, confidential or proprietary materials and information from you through the DevExpress Support Center or its web properties. Any and all materials or information divulged during chats, email communications, online discussions, Support Center tickets, or made available to Developer Express Inc in any manner will be deemed NOT to be confidential by Developer Express Inc. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.