Back to Devexpress

Drill Down to the Underlying Data

windowsforms-1882-controls-and-libraries-pivot-grid-data-shaping-summarization-summaries-obtaining-underlying-data-drill-down.md

latest14.0 KB
Original Source

Drill Down to the Underlying Data

  • Sep 09, 2022
  • 6 minutes to read

A pivot grid cell value is a summary calculated against a data field for a subset of records retrieved from the PivotGrid’s underlying data source.

Consider the pivot grid shown in the picture below.

The highlighted cell value $8,467.72 is calculated as a sum of Extended Price field values for the records that meet the following criteria:

  • the Country and City field values are equal to the row field values ( Austria and Graz , respectively)
  • the Order Year and Order Month field values are equal to the column field values ( 2017 and 1 , respectively)

The cell’s underlying data is shown in the following picture:

To get underlying records for a particular cell, use the CreateDrillDownDataSource method. The following table shows how to access this method in different situations.

SituationInstruction
Click or double-click the cellHandle the PivotGridControl.CellClick or PivotGridControl.CellDoubleClick event and call the e.CreateDrillDownDataSource method.
Hit testCall the PivotGridControl.CalcHitInfo method to get a HitInfo object for a test point. If the point belongs to a cell, use the PivotGridHitInfo.CellInfo property to get the PivotCellEventArgs object. Call its CreateDrillDownDataSource method.
Get data for a particular cellCall the PivotGridControl.CreateDrillDownDataSource method.
Get data for a particular cell asynchronouslyCall the PivotGridControl.CreateDrillDownDataSourceAsync method.
Get data for a particular cellUse the GetCellInfo and GetFocusedCellInfo methods of the PivotGridCells object accessible with the PivotGridControl.Cells property. Those methods return the PivotCellEventArgs object. Call its CreateDrillDownDataSource method.
Calculate custom summaryHandle the PivotGridControl.CustomSummary event and call the e.CreateDrillDownDataSource method.
Perform custom drawHandle the PivotGridControl.CustomDrawCell event and call the CreateDrillDownDataSource method.
Display custom textHandle the PivotGridControl.CustomCellDisplayText and call the e.CreateDrillDownDataSource method.
Display custom imagesHandle the PivotGridControl.FieldValueImageIndex event and call the e.CreateDrillDownDataSource method.
Customize cells in printout or exported documentHandle the CustomExportCell event and call the e.CreateDrillDownDataSource method.

Example: How to Display the Underlying Records

This example demonstrates how to obtain the records from the control’s underlying data source for a particular cell. Double-click a cell to invoke a form that contains a grid to show the underlying data.

Note

The complete sample project How to: Display Underlying (Drill-Down) Records is available in the DevExpress Examples repository.

The primary data source is the Northwind database contained in the SQL Server data file NW.mdf. The application can use the BindingSource component or the LinqServerModeDataSource instance to retrieve the data from the database. A LinqServerModeDataSource data source is a queryable data source, and it forces the PivotGrid to operate in server mode. Click the Server Mode toggle switch control to switch from one data source to another.

When you double-click the PivotGrid cell, the PivotGridControl.CellDoubleClick event occurs. The following CreateDrillDownDataSource method overrides are called to obtain the list of records associated with the selected cell:

You can also click the Get Grand Total Data button to call the PivotGridControl.CreateDrillDownDataSource method and display all data records that the PivotGridControl uses to show the summarized data.

csharp
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraPivotGrid;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace DrillDownDataSourceExample
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        bool serverMode = false;
        public Form1()
        {
            InitializeComponent();
            pivotGridControl1.CellDoubleClick += PivotGridControl1_CellDoubleClick;
            // This line of code is generated by Data Source Configuration Wizard
            linqServerModeSource1.QueryableSource = new DrillDownDataSourceExample.DataClasses1DataContext().Invoices;
        }

        private void PivotGridControl1_CellDoubleClick(object sender, DevExpress.XtraPivotGrid.PivotCellEventArgs e)
        {
            PivotDrillDownDataSource drillDownDataSource;
            if (serverMode)
               drillDownDataSource = e.CreateDrillDownDataSource(25, new List<string> { "ShipName" });
            else
                drillDownDataSource = e.CreateDrillDownDataSource(25);
            XtraForm dataform = CreateDrillDownForm(drillDownDataSource);
            dataform.ShowDialog();
            dataform.Dispose();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'nWDataSet.Invoices' table. You can move, or remove it, as needed.
            this.invoicesTableAdapter.Fill(this.nWDataSet.Invoices);
            SetPivotGridDataSource();
        }

        private XtraForm CreateDrillDownForm(PivotDrillDownDataSource dataSource) {
            XtraForm form = new XtraForm();
            GridControl grid = new GridControl();
            grid.Parent = form;
            grid.Dock = DockStyle.Fill;
            grid.DataSource = dataSource;
            grid.DataSource =
            form.Bounds = new Rectangle(100, 100, 800, 400);
            GridView gridView1 = new GridView();
            grid.MainView = gridView1;
            gridView1.Columns["OrderDate"].DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
            form.Text = string.Format("Underlying Data - {0} Records", dataSource.RowCount);
            return form;
        }

        private void toggleSwitch1_Toggled(object sender, EventArgs e)
        {
            serverMode = ((ToggleSwitch)sender).IsOn;
            SetPivotGridDataSource();
        }

        private void SetPivotGridDataSource()
        {
            if (serverMode)
                pivotGridControl1.DataSource = linqServerModeSource1;
            else
                pivotGridControl1.DataSource = invoicesBindingSource;
        }

        private void btnGrandTotal_Click(object sender, EventArgs e)
        {
            PivotDrillDownDataSource drillDownDataSource = pivotGridControl1.CreateDrillDownDataSource();
            Form dataform = CreateDrillDownForm(drillDownDataSource);
            dataform.ShowDialog();
            dataform.Dispose();
        }
    }
}
vb
Imports DevExpress.XtraEditors
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraPivotGrid
Imports System
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Windows.Forms

Namespace DrillDownDataSourceExample
   Partial Public Class Form1
      Inherits DevExpress.XtraEditors.XtraForm

      Private serverMode As Boolean = False
      Public Sub New()
         InitializeComponent()
         AddHandler pivotGridControl1.CellDoubleClick, AddressOf PivotGridControl1_CellDoubleClick
         ' This line of code is generated by Data Source Configuration Wizard
         linqServerModeSource1.QueryableSource = (New DrillDownDataSourceExample.DataClasses1DataContext()).Invoices
      End Sub

      Private Sub PivotGridControl1_CellDoubleClick(ByVal sender As Object, ByVal e As DevExpress.XtraPivotGrid.PivotCellEventArgs)
         Dim drillDownDataSource As PivotDrillDownDataSource
         If serverMode Then
            drillDownDataSource = e.CreateDrillDownDataSource(25, New List(Of String) From {"ShipName"})
         Else
            drillDownDataSource = e.CreateDrillDownDataSource(25)
         End If
         Dim dataform As XtraForm = CreateDrillDownForm(drillDownDataSource)
         dataform.ShowDialog()
         dataform.Dispose()
      End Sub

      Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
         ' TODO: This line of code loads data into the 'nWDataSet.Invoices' table. You can move, or remove it, as needed.
         Me.invoicesTableAdapter.Fill(Me.nWDataSet.Invoices)
         SetPivotGridDataSource()
      End Sub

      Private Function CreateDrillDownForm(ByVal dataSource As PivotDrillDownDataSource) As XtraForm
         Dim form As New XtraForm()
         Dim grid As New GridControl()
         grid.Parent = form
         grid.Dock = DockStyle.Fill
         grid.DataSource = dataSource
         form.Bounds = New Rectangle(100, 100, 800, 400)
         grid.DataSource = form.Bounds
         Dim gridView1 As New GridView()
         grid.MainView = gridView1
         gridView1.Columns("OrderDate").DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime
         form.Text = String.Format("Underlying Data - {0} Records", dataSource.RowCount)
         Return form
      End Function

      Private Sub toggleSwitch1_Toggled(ByVal sender As Object, ByVal e As EventArgs) Handles toggleSwitch1.Toggled
         serverMode = DirectCast(sender, ToggleSwitch).IsOn
         SetPivotGridDataSource()
      End Sub

      Private Sub SetPivotGridDataSource()
         If serverMode Then
            pivotGridControl1.DataSource = linqServerModeSource1
         Else
            pivotGridControl1.DataSource = invoicesBindingSource
         End If
      End Sub

      Private Sub btnGrandTotal_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGrandTotal.Click
         Dim drillDownDataSource As PivotDrillDownDataSource = pivotGridControl1.CreateDrillDownDataSource()
         Dim dataform As Form = CreateDrillDownForm(drillDownDataSource)
         dataform.ShowDialog()
         dataform.Dispose()
      End Sub
   End Class
End Namespace

See Also

Summaries Overview