Skip to main content

PivotGridControl.CreateDrillDownDataSource(Int32, Int32, Int32, List<String>) Method

Returns data records used to calculate a summary value for the specified cell. Allows you to specify the columns and limit the number of records to return.

Namespace: DevExpress.XtraPivotGrid

Assembly: DevExpress.XtraPivotGrid.v24.1.dll

NuGet Package: DevExpress.Win.PivotGrid


public PivotDrillDownDataSource CreateDrillDownDataSource(
    int columnIndex,
    int rowIndex,
    int maxRowCount,
    List<string> customColumns


Name Type Description
columnIndex Int32

A zero-based visible column’s index of the column. Set it to -1 to obtain the column’s Grand Total.

rowIndex Int32

A zero-based visible row’s index. Set it to -1 to obtain the row’s Grand Total.

maxRowCount Int32

An integer value that specifies the maximum number of data rows to be returned. -1 to retrieve all rows.

customColumns List<String>

A list of columns to be returned.


Type Description

A PivotDrillDownDataSource object that contains the underlying data.



The customColumns parameter is in effect in Server and OLAP modes only; otherwise, it is ignored.

If you use the CreateDrillDownDataSource method in OLAP mode, take note of the following limitations:

OLAP Server Note
MS SQL Server Analysis Services 2000 The customColumns parameter is ignored and the CreateDrillDownDataSource method returns the granularity attributes.
MS SQL Server Analysis Services 2005 and 2008 If the customColumns list is null or empty, the CreateDrillDownDataSource method returns the columns related to the current column, row and data PivotGrid fields. The method also returns filter fields, if any.
Any OLAP Server If returned records contain a column used as a filter in Pivot Grid, the returned data are filtered.
Any OLAP Server The CreateDrillDownDataSource is not applicable for fields which are calculated measures.
MS SQL Server Analysis Services - all versions Multiple filter items selected in a Filter field results in an exception.

In server and OLAP modes, the CreateDrillDownDataSource method returns only visible fields. To get hidden field values, use the method’s overloads with the customColumns parameter which allow you to specify the columns to return.


For an example of use refer to the CreateDrillDownDataSource(Int32, Int32, Int32, List<String>) topic.


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.


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.


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()
            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" });
                drillDownDataSource = e.CreateDrillDownDataSource(25);
            XtraForm dataform = CreateDrillDownForm(drillDownDataSource);

        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.

        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;

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

        private void btnGrandTotal_Click(object sender, EventArgs e)
            PivotDrillDownDataSource drillDownDataSource = pivotGridControl1.CreateDrillDownDataSource();
            Form dataform = CreateDrillDownForm(drillDownDataSource);
See Also