Skip to main content

Date Filter in WinForms Dashboard

  • 11 minutes to read

The Date Filter dashboard item allows you to filter dashboard data based on the selected data range. The range can be relative (Last 3 Months), use fixed dates (01-01-2018), or presets (Month-to-date). You can also filter dates before or after a specified date.

Run Demo: Date Filter

The Date Filter item displays a set of intervals that can be used as quick filters.

Date Filter

End-users can click the button to invoke the Date Picker:

Date Filter - Date Picker Drop-Down

Add a New Date Filter to the Dashboard

WinForms Designer

In the WinForms Designer, click the Filter Elements drop-down button in the Insert group on the Home ribbon page and select Date Filter.

DateFilter - Ribbon

Visual Studio Designer
In the Visual Studio Designer, drag the DateFilter component from the Toolbox and drop it on the dashboard.
In code
Create the DateFilterDashboardItem class instance and add it to the Dashboard.Items collection.

Bind to Data

You can use DateTime/DateOnly fields for a date filter.

Dashboard Designer

Use the Data Items Pane to make data binding. Drag the dimension field from the Data Source Browser to the data item, and click the Options button to select group intervals.

DATA ITEMS Pane

In code
Use the DateFilterDashboardItem.Dimension property to specify a dimension that provides filter values.

Filter Type

A filter can be a date-time (date) value, date-time (date) range, or infinite interval before or after a specified date.

You can specify the filter type as follows:

Dashboard Designer

Click the drop-down Filter Type in the ribbon (Date Filter Tools contextual tab-> Design page -> Layout group):

datefilter-filtertype-ribbon

In Code
Use the DateFilterDashboardItem.FilterType property.

Date Picker

Date Picker

The DateFilter item contains a Date Picker - a button with a drop-down calendar. This button initially displays “Click to set filter”. To change this text, provide the DateFilterDatePickerButtonDefaultText localization string or handle the DashboardViewer.DashboardItemControlCreated event and subscribe to the DateFilterControl.CustomDisplayText event.

The calendar drops down when the end user:

  • clicks the button without a specified range (the button with the “Click to set filter” caption)
  • clicks the Edit icon (date filter - edit icon) on the button with the specified date-time range.

A drop-down calendar may contain a single calendar control (the Filter Type is Exact, Before or After) or two calendar controls (the Filter Type is Between).

When the user selects the date, the Date Picker caption displays information about that date (date range) and an edit-date-filter-icon icon. The caption text is constructed from a custom string with date placeholders. If the user clicks the caption, The Date Picker button acts as a checked button to apply the date range (checked) or reset the date filter (unchecked) to its default value. When the user clicks the icon, the drop-down calendar appears and enables the user to select another date range.

The Date Picker component can be located at the near end of the Quick Button series, at its far end, or it can be hidden. To change the Date Picker location:

In the Dashboard Designer

Click the Date Picker Location check button in the ribbon (Date Filter Tools contextual tab-> Design page -> Layout group):

In Code
Set the DateFilterDashboardItem.DatePickerLocation property.

Display Format

You can specify the date-time value format as follows:

In the Dashboard Designer
Use the Format submenu in the data item menu, as described in the Formatting Data topic.
In Code
Use the dimension’s DateTimeFormat property.

You can specify a custom string displayed in the Date Picker component as follows:

In the Dashboard Designer

Use the Edit Names dialog. To invoke the dialog, right-click the DateFilter item and click the Edit Names… menu item or click the Edit Names button in the Design Ribbon tab.

datefilter-displaytextpattern-editnames-dialog

In Code
Use the DateFilterDashboardItem.DisplayTextPattern property.

You can include placeholders in a custom string. The {0} placeholder is the interval’s start, the {1} placeholder is the interval’s end.

Create Quick Filters in UI

Quick Filters are a set of predefined date periods you can show as buttons in the Date Filter UI, such as Today, Yesterday, Last 30 Days, and so on. These intervals are preconfigured and have a DateTime/DateOnly range assigned to them. When the user selects one of the quick filters, the dashboard automatically filters data based on that relative date range:

Quick Filters

The DateFilter’s context menu contains commands with the same captions that act the same ways as these buttons.

A newly created DateFilter dashboard item has no quick filters. To add a quick filter in the Dashboard Designer, do one of the following:

  • Click the Options button (the BoundImageAttributeOptionsButton icon) next to the Argument placeholder.
  • Select the Edit Periods command in the item’s context menu.
  • Click the Edit Periods in the ribbon (Date Filter Tools contextual tab → Design page → Interactivity group):

    datefilter-editperiods-ribbon

This invokes the Edit Periods dialog. You can select a predefined range or add a custom period, and specify the quick filter’s range and caption.

date-filter-edit-periods-dialog

In addition to a variety of predefined ranges, you can set a custom period - a period with custom boundaries (Start point and End point). You can specify the following settings for the start/end boundaries:

Boundaries Settings

You can specify the following settings for the start/end boundaries.

Caption
Specifies a custom periods caption.
Start Mode
Specifies the start boundary mode.
End Mode
Specifies the end boundary mode.

Boundaries Modes

The following modes are available for the start and end boundaries:

None
The selection begins from the start/end of the visible range.
Fixed
Allows you to select a specific date value using the calendar. Use the Start/End Date option to set a value.
Flow
Allows you to select a relative date value. The Interval option specifies the interval between the current date and the required date. The Offset option allows you to set the number of such intervals. The Offset option can accept negative and positive values. Negative values correspond to dates before the current date, while positive values correspond to future dates.

Review the following examples of custom period set up.

Fixed Custom Periods Examples

Name

Settings

2018

Start Point

  • Mode: Fixed
  • Start Date: 01/01/2018

End Point

  • Mode: Fixed
  • End Date: 12/31/2018

Q1 2017

Start Point

  • Mode: Fixed
  • Start Date: 01/01/2017

End Point

  • Mode: Fixed
  • End Date: 03/31/2018

Flow Custom Periods Examples

Name

Settings

6 Months

Start Point

  • Mode: Flow
  • Interval: Month
  • Offset: -5

End Point

  • Mode: None

Year to date

Start Point

  • Mode: Flow
  • Interval: Year
  • Offset: 0

End Point

  • Mode: Flow
  • Interval: Day
  • Offset: 0

Last Month

Start Point

  • Mode: Flow
  • Interval: Month
  • Offset: -1

End Point

  • Mode: Flow
  • Interval: Month
  • Offset: 0

If you set both start and end intervals with Flow Mode and 0 Offset configuration, the system subtracts 1 millisecond from the calculated end date to create a Start Point. This adjustment ensures that the Start Point is always strictly less than the End Point according to the selected end interval (year, month, week, and so on).

Create Quick Filter in Code

To add a quick filter in code, create the DateTimePeriod objects and add them to the DateFilterDashboardItem.DateTimePeriods collection.

using DevExpress.DashboardCommon;
// ...
dateFilterItem.DateTimePeriods.AddRange(
    DateTimePeriod.CreateLastYear(),
    DateTimePeriod.CreateNextDays("Next 7 Days", 7),
    new DateTimePeriod
    { Name = "Month To Date",
        Start = new FlowDateTimePeriodLimit(DateTimeInterval.Month,0),
        End = new FlowDateTimePeriodLimit(DateTimeInterval.Day,1)
    },
    new DateTimePeriod
    { Name = "Jul-18-2018 - Jan-18-2019",
        Start = new FixedDateTimePeriodLimit(new DateTime(2018, 7, 18)),
        End = new FixedDateTimePeriodLimit(new DateTime(2019, 1, 18)) }
    );
// Specify the period selected when the control is initialized.
dateFilterItem.DefaultDateTimePeriodName = "Year To Date";

Arrange Quick Filters

Quick filters in the DateFilter item can be arranged horizontally or vertically. The default mode is auto height, in which quick filters are displayed horizontally and the dashboard item shrinks automatically to fit the items and save space.

To specify the arrangement mode:

In the Dashboard Designer

Click the Arrangement Mode drop-down in the ribbon (Date Filter Tools contextual tab-> Design page -> Layout group):

datefilter-arrangement-ribbon

In Code
Set the DateFilterDashboardItem.ArrangementMode property.

Customize Underlying Controls

You can customize the appearance of DateFilter buttons and drop-down calendar. To do this, access the underlying DateFilterControl as described in the Access to Underlying Controls topic and change its settings.

Example

The following code snippet creates a DateFilter dashboard item in code:

using DevExpress.DashboardCommon;
using DevExpress.DashboardWin.Localization;
using DevExpress.DataAccess.Excel;
using DevExpress.XtraEditors;
using System;

namespace DateFilterDashboardItemSample
{
    public partial class Form1 : XtraForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DashboardExcelDataSource excelDataSource = CreateExcelDataSource();
            Dashboard dBoard = new Dashboard();
            dBoard.DataSources.Add(excelDataSource);

            dBoard.BeginUpdate();
            // Create dashboard items.
            ChartDashboardItem chart = CreateChart(excelDataSource);
            dBoard.Items.Add(chart);
            DateFilterDashboardItem dateFilterItem = CreateDateFilterItem(excelDataSource);
            dBoard.Items.Add(dateFilterItem);
            DashboardItemGroup group = CreateGroup();
            dBoard.Groups.Add(group);
            group.AddRange(dateFilterItem, chart);
            // Create the layout tree.
            DashboardLayoutItem dateFilterLayoutItem = new DashboardLayoutItem(dateFilterItem, 30);
            DashboardLayoutItem chartLayoutItem = new DashboardLayoutItem(chart, 70);
            DashboardLayoutGroup groupLayoutItem = new DashboardLayoutGroup(group, 100);
            groupLayoutItem.ChildNodes.AddRange(dateFilterLayoutItem, chartLayoutItem);
            DashboardLayoutGroup rootGroup = new DashboardLayoutGroup(null, 100);
            rootGroup.ChildNodes.Add(groupLayoutItem);
            rootGroup.Orientation = DashboardLayoutGroupOrientation.Vertical;
            dBoard.LayoutRoot = rootGroup;
            dBoard.EndUpdate();

            dashboardViewer1.Dashboard = dBoard;
        }

        private DashboardItemGroup CreateGroup()
        {
            DashboardItemGroup group = new DashboardItemGroup();
            group.Name = "Sales by Date";
            return group;
        }

        private DateFilterDashboardItem CreateDateFilterItem(DashboardExcelDataSource excelDataSource)
        {
            DateFilterDashboardItem dateFilter = new DateFilterDashboardItem();
            dateFilter.Name = string.Empty;
            dateFilter.ShowCaption = false;
            dateFilter.DataSource = excelDataSource;
            dateFilter.Dimension = new Dimension("orderDateId", "OrderDate", DateTimeGroupInterval.DayMonthYear);
            dateFilter.Dimension.DateTimeFormat.DateTimeFormat = DateTimeFormat.Short;
            dateFilter.ArrangementMode = DateFilterArrangementMode.Vertical;
            dateFilter.FilterType = DateFilterType.Between;
            dateFilter.DatePickerLocation = DatePickerLocation.Far;
            dateFilter.DateTimePeriods.AddRange(
                DateTimePeriod.CreateLastYear(),
                DateTimePeriod.CreateNextDays("Next 7 Days", 7),
                new DateTimePeriod
                {
                    Name = DashboardWinLocalizer.GetString(DashboardWinStringId.PeriodMonthToDate),
                    Start = new FlowDateTimePeriodLimit
                    {
                        Interval = DateTimeInterval.Month,
                        Offset = 0
                    },
                    End = new FlowDateTimePeriodLimit
                    {
                        Interval = DateTimeInterval.Day,
                        Offset = 1
                    }
                },
                new DateTimePeriod
                {
                    Name = "Jul-18-2018 - Jan-18-2019",
                    Start = new FixedDateTimePeriodLimit
                    {
                        Date = new DateTime(2018, 7, 18)
                    },
                    End = new FixedDateTimePeriodLimit
                    {
                        Date = new DateTime(2019, 1, 18)
                    }
                }
            );
            return dateFilter;
        }

        private ChartDashboardItem CreateChart(DashboardExcelDataSource excelDataSource)
        {
            ChartDashboardItem chart = new ChartDashboardItem();
            chart.Name = string.Empty;
            chart.ShowCaption = false;
            chart.DataSource = excelDataSource;
            chart.Arguments.Add(new Dimension("OrderDate", DateTimeGroupInterval.DayMonthYear));
            chart.Panes.Add(new ChartPane());
            SimpleSeries salesAmountSeries = new SimpleSeries(SimpleSeriesType.Line);
            salesAmountSeries.Value = new Measure("Extended Price");
            chart.Panes[0].Series.Add(salesAmountSeries);
            return chart;
        }

        private DashboardExcelDataSource CreateExcelDataSource()
        {
            DashboardExcelDataSource excelDataSource = new DashboardExcelDataSource();
            excelDataSource.FileName = "SalesPerson.xlsx";
            ExcelWorksheetSettings worksheetSettings = new ExcelWorksheetSettings("Data");
            excelDataSource.SourceOptions = new ExcelSourceOptions(worksheetSettings);
            excelDataSource.Fill();
            return excelDataSource;
        }
    }
}
See Also