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

How to: Create Drill-Down Reports

  • 3 minutes to read

This example illustrates how to create interactive drill-down documents by handling the DocumentPreviewControl.DocumentPreviewMouseClick and DocumentPreviewControl.DocumentPreviewMouseMove events.

#region reference
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using DevExpress.Mvvm.DataAnnotations;
using DevExpress.Mvvm.POCO;
using DevExpress.Xpf.Printing;
#endregion reference

namespace PreviewClickDemo {
    [POCOViewModel]
    #region code
    public class MainWindowViewModel {
        readonly Northwind.CategoriesDataTable categories;
        readonly IList<Northwind.CategoriesRow> expandedCategories = new List<Northwind.CategoriesRow>();

        public SimpleLink Link { get; private set; }

        public static MainWindowViewModel Create(DataTemplate detailDataTemplate) {
            return ViewModelSource.Create(() => new MainWindowViewModel(detailDataTemplate));
        }

        protected MainWindowViewModel(DataTemplate detailDataTemplate) {
            // Populate the data source.
            var nwind = DataSource.CreateNorthwindData();
            categories = nwind.Categories;

            // Assign a new SimpleLink instance to the link object, 
            // with the specified data template and the number of detail records.
            Link = new SimpleLink(detailDataTemplate, categories.Count);

            // Handle the link's CreateDetail event, where it obtains its data.
            Link.CreateDetail += OnLinkCreateDetail;
        }

        void OnLinkCreateDetail(object sender, CreateAreaEventArgs e) {
            var category = categories[e.DetailIndex];
            e.Data = new CategoryWrapper(expandedCategories.Contains(category), category);
        }

        // Provide the drill-down functionality in the OnPreviewMouseClick event handler.
        public void OnPreviewMouseClick(DocumentPreviewMouseEventArgs args) {
            if (string.IsNullOrEmpty((string)args.ElementTag)) {
                return;
            }
            var categoryID = int.Parse(args.ElementTag.ToString());
            var category = categories.FindByCategoryID(categoryID);

            if (expandedCategories.Contains(category)) {
                expandedCategories.Remove(category);
            }
            else {
                expandedCategories.Add(category);
            }
            Link.CreateDocument(true);
        }

        // Change the mouse cursor when it hovers the label 
        // that serves as a link to expand/collapse the detail data.
        public void OnPreviewMouseMove(DocumentPreviewMouseEventArgs args) {
            if (string.IsNullOrEmpty((string)args.ElementTag)) {
                return;
            }
            Mouse.SetCursor(Cursors.Hand);
        }
    }
    #endregion code
}

The following image illustrates the result.

drill-down-report