Skip to main content
.NET 8.0+

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

Open a Detail View When the Grid Row is Clicked in the Dashboard (WinForms and ASP.NET Web Forms)

  • 8 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 and ASP.NET Web Forms)

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;
    }
}

ASP.NET Web Forms Example

using DevExpress.DashboardWeb;
using DevExpress.Data.Filtering;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.ExpressApp.Dashboards.Web;
using DevExpress.ExpressApp.Web;
using DevExpress.ExpressApp.Web.Templates;
using DevExpress.Persistent.Base;
using ShowDetailViewFromDashboard.Module.BusinessObjects;
using System;
// ...
public class WebShowDetailViewFromDashboardController : ObjectViewController<DetailView, IDashboardData>, IXafCallbackHandler
{
    private const string HandlerName = "WebShowDetailViewFromDashboardController";
    private ParametrizedAction openDetailViewAction;

    protected override void OnActivated()
    {
        base.OnActivated();
        WebDashboardViewerViewItem dashboardViewerViewItem = View.FindItem("DashboardViewer") as WebDashboardViewerViewItem;
        if (dashboardViewerViewItem != null)
        {
            if (dashboardViewerViewItem.DashboardDesigner != null)
            {
                CustomizeDashboardViewer(dashboardViewerViewItem.DashboardDesigner);
            }
            dashboardViewerViewItem.ControlCreated += DashboardViewerViewItem_ControlCreated;
        }
    }
    private void DashboardViewerViewItem_ControlCreated(object sender, EventArgs e)
    {
        WebDashboardViewerViewItem dashboardViewerViewItem = sender as WebDashboardViewerViewItem;
        CustomizeDashboardViewer(dashboardViewerViewItem.DashboardDesigner);
    }
    private void CustomizeDashboardViewer(ASPxDashboard dashboardControl)
    {
        XafCallbackManager callbackManager = ((ICallbackManagerHolder)WebWindow.CurrentRequestPage).CallbackManager;
        callbackManager.RegisterHandler(HandlerName, this);
        string widgetScript = @"function getOid(s, e) {{
                                    function findMeasure(measure) {{
                                        return measure.DataMember === 'Oid';
                                    }}
                                    if (e.ItemName.includes('gridDashboardItem')) {{
                                            var itemData = e.GetData(),
                                            dataSlice = itemData.GetSlice(e.GetAxisPoint()),
                                            oidMeasure = dataSlice.GetMeasures().find(findMeasure).Id,
                                            measureValue = dataSlice.GetMeasureValue(oidMeasure);
                                            {0}
                                    }}
                                }}";
        dashboardControl.ClientSideEvents.ItemClick = string.Format(widgetScript, callbackManager.GetScript(HandlerName, "measureValue.GetValue()"));
    }
    public void ProcessAction(string parameter)
    {
        openDetailViewAction.DoExecute(parameter);
    }
    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()
    {
        WebDashboardViewerViewItem dashboardViewerViewItem = View.FindItem("DashboardViewer") as WebDashboardViewerViewItem;
        if (dashboardViewerViewItem != null)
        {
            dashboardViewerViewItem.ControlCreated -= DashboardViewerViewItem_ControlCreated;
        }
        base.OnDeactivated();
    }
    public WebShowDetailViewFromDashboardController()
    {
        openDetailViewAction = new ParametrizedAction(this, "Dashboard_OpenDetailView", "Dashboard", typeof(string));
        openDetailViewAction.Caption = "OpenDetailView";
        openDetailViewAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject;
        openDetailViewAction.Execute += OpenDetailViewAction_Execute;
    }
}