Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

DrillThroughContext Class

Contains information about drill-through navigation.

Namespace: DevExpress.XtraReports.Web.WebDocumentViewer

Assembly: DevExpress.XtraReports.v24.2.Web.dll

NuGet Package: DevExpress.Web.Reporting.Common

#Declaration

public class DrillThroughContext

#Remarks

You can click on the report data displayed in the Document Viewer or Report Designer Preview to show another report with related data (drill-through).

To implement drill-through navigation, do the following:

#ASP.NET MVC

Create a class with the IWebDocumentViewerDrillThroughProcessor interface. The IWebDocumentViewerDrillThroughProcessor.CreateReport method accepts the DrillThroughContext object and returns a report for display. Call the DefaultWebDocumentViewerContainer.RegisterWebDocumentViewerDrillThroughProcessor<T> method to register a custom drill-through processor at application startup.

using DevExpress.XtraReports.UI;
using DevExpress.XtraReports.Web.WebDocumentViewer;
using WebApplication1.Reports;
// ...
  public class CustomDrillThroughProcessor : IWebDocumentViewerDrillThroughProcessor {
      public XtraReport CreateReport(DrillThroughContext context) {
          if (context.CustomData == "#back")
              return new MainReport();
          if (context.CustomData == "#detail1")
              return new DetailReport1();
          if (context.CustomData == "#detail2")
              return new DetailReport2();
          return context.Report;
      }
  }

To get data related to the clicked element, handle the client-side PreviewClick event:

<html>
<head runat="server">
   <script>
       function previewClick(s, e) {
           var brick = e.Brick;
           var previewModel = s.GetPreviewModel();
           var reportPreview = previewModel && previewModel.reportPreview;
           if (brick && brick.navigation && brick.navigation.url && ["#back", "#detail1", "#detail2"].indexOf(brick.navigation.url) >= 0) {
               reportPreview.drillThrough(brick.navigation.url);
               e.Handled = true;
           }
       }
   </script>
</head>
<body>
   <form id="form1" runat="server">
   <div>    
       <dx:ASPxWebDocumentViewer ID="ASPxWebDocumentViewer1" runat="server">
           <ClientSideEvents PreviewClick="previewClick"/>
       </dx:ASPxWebDocumentViewer>    
   </div>
   </form>
</body>
</html>

View Example: How to provide drill-through functionality to web reports

#ASP.NET Core

Create a class with the IDrillThroughProcessor interface. The IDrillThroughProcessor.CreateReport method accepts the DrillThroughContext object and returns a report for display. Call the ServiceCollectionServiceExtensions.AddScoped<TService,TImplementation> method to register a custom drill-through processor at application startup.

You can asynchronously create reports for drill-through navigation with the IDrillThroughProcessorAsync interface implementation. It contains the CreateReportAsync method. At application startup you should call the ReportingConfigurationBuilder.UseAsyncEngine method and register a custom service with the ServiceCollectionServiceExtensions.AddScoped<TService,TImplementation> method:

using System;
using System.Text.Json;
using System.Threading.Tasks;
using DevExpress.XtraReports.Services;
using DevExpress.XtraReports.Web.WebDocumentViewer;
// ...
    public class NavigateInfo {
        public string NavigateTo { get; set; }
        public string MasterID { get; set; }
    }
    public class CustomDrillThroughProcessorAsync : IDrillThroughProcessorAsync {
        readonly IReportProviderAsync reportProviderAsync;

        public CustomDrillThroughProcessorAsync(IReportProviderAsync reportProviderAsync) {
            this.reportProviderAsync = reportProviderAsync;
        }
        public async Task<DrillThroughResult> CreateReportAsync(DrillThroughContext context) {
            NavigateInfo navigateInfo = JsonSerializer.Deserialize<NavigateInfo>(context.CustomData);
            var reportNameToOpen = navigateInfo.NavigateTo == "back" ? "MainReport"
                : navigateInfo.NavigateTo == "details" ? "DetailReport1" : null;
            var report = await reportProviderAsync.GetReportAsync(reportNameToOpen, null) ?? context.Report;

            if(navigateInfo.NavigateTo == "details") {
                int catID = 0;
                Int32.TryParse(navigateInfo.MasterID, out catID);
                report.Parameters["categoryID"].Value = catID;
            }
            return new DrillThroughResult(report);
        }
    }

To get data related to the clicked element, handle the client-side PreviewClick event:

@model DevExpress.XtraReports.Web.WebDocumentViewer.WebDocumentViewerModel;
<script>
   function previewClick(s, e) {
       var brick = e.Brick;
       var navigationUrl = brick && brick.navigation && brick.navigation.url;
       if(navigationUrl && ["back", "details"].indexOf(navigationUrl) >= 0) {
           var reportPreview = s.GetReportPreview();
           var navigateInfo = {
               NavigateTo: navigationUrl,
               MasterID: e.GetBrickValue(),
           };
           reportPreview.drillThrough(JSON.stringify(navigateInfo));
           e.Handled = true;
       }
   }
</script>
@{
   var viewerRender = Html.DevExpress().WebDocumentViewer("DocumentViewer")
       .Height("800px")
       .ClientSideEvents(configure => configure.PreviewClick("previewClick"))
       .Bind(Model);
   @viewerRender.RenderHtml()
}

View Example: How to provide drill-through functionality to web reports

#Inheritance

See Also