Skip to main content
.NET 6.0+

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