Skip to main content

Open a Detail View When the Grid Row is Clicked in the Dashboard (WinForms)

  • 3 minutes to read

This topic describes how to invoke a Detail View when a user clicks a row in the GridDashboardItem created using the Dashboards Module. In the invoked Detail View, a user can view or edit a business object corresponding to the clicked row.

View Example: Open a Detail View When the Grid Row is Clicked in the Dashboard (WinForms)

WinForms Example

using DevExpress.DashboardCommon;
using DevExpress.DashboardCommon.ViewerData;
using DevExpress.DashboardWin;
using DevExpress.Data.Filtering;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.ExpressApp.Dashboards.Win;
using DevExpress.Persistent.Base;
using ShowDetailViewFromDashboard.Module.BusinessObjects;
using System;
using System.Linq;
// ...
public class WinShowDetailViewFromDashboardController : ObjectViewController<DetailView, IDashboardData> {
    private ParametrizedAction openDetailViewAction;

    protected override void OnActivated() {
        base.OnActivated();
        WinDashboardViewerViewItem dashboardViewerViewItem = View.FindItem("DashboardViewer") as WinDashboardViewerViewItem;
        if (dashboardViewerViewItem != null) {
            if (dashboardViewerViewItem.Viewer != null) {
                dashboardViewerViewItem.Viewer.DashboardItemDoubleClick += Viewer_DashboardItemDoubleClick;
            }
            dashboardViewerViewItem.ControlCreated += DashboardViewerViewItem_ControlCreated;
        }
    }

    private void DashboardViewerViewItem_ControlCreated(object sender, EventArgs e) {
        WinDashboardViewerViewItem dashboardViewerViewItem = sender as WinDashboardViewerViewItem;
        dashboardViewerViewItem.Viewer.DashboardItemDoubleClick += Viewer_DashboardItemDoubleClick;
    }
    private bool IsGridDashboardItem(Dashboard dashboard, string dashboardItemName) {
        DashboardItem dashboardItem = dashboard.Items.SingleOrDefault(item => item.ComponentName == dashboardItemName);
        return dashboardItem is GridDashboardItem;
    }
    private static string GetOid(DashboardItemMouseActionEventArgs e) {
        MultiDimensionalData data = e.Data.GetSlice(e.GetAxisPoint());
        MeasureDescriptor descriptor = data.GetMeasures().SingleOrDefault(item => item.DataMember == "Oid");
        MeasureValue measureValue = data.GetValue(descriptor);
        return measureValue.Value.ToString();
    }
    private void Viewer_DashboardItemDoubleClick(object sender, DashboardItemMouseActionEventArgs e) {
        Dashboard dashboard = ((DashboardViewer)sender).Dashboard;

        if (IsGridDashboardItem(dashboard, e.DashboardItemName) &&
            openDetailViewAction.Enabled && openDetailViewAction.Active) {
            openDetailViewAction.DoExecute(GetOid(e));
        }
    }

    private void OpenDetailViewAction_Execute(object sender, ParametrizedActionExecuteEventArgs e) {
        IObjectSpace objectSpace = Application.CreateObjectSpace(typeof(Contact));
        Contact contact = objectSpace.FirstOrDefault<Contact>(c => c.Oid == e.ParameterCurrentValue.ToString();
        if (contact != null) {
            e.ShowViewParameters.CreatedView = Application.CreateDetailView(objectSpace, contact, View);
        }
    }

    protected override void OnDeactivated() {
        WinDashboardViewerViewItem dashboardViewerViewItem = View.FindItem("DashboardViewer") as WinDashboardViewerViewItem;
        if (dashboardViewerViewItem != null) {
            dashboardViewerViewItem.ControlCreated -= DashboardViewerViewItem_ControlCreated;
        }
        base.OnDeactivated();
    }
    public WinShowDetailViewFromDashboardController() {
        openDetailViewAction = new ParametrizedAction(this, "Dashboard_OpenDetailView", "Dashboard", typeof(string));
        openDetailViewAction.Caption = "OpenDetailView";
        openDetailViewAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject;
        openDetailViewAction.Execute += OpenDetailViewAction_Execute;
    }
}