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.
WinForms Example
Add a key property to the hidden measures of a Dashboard and set its summary type to Min or Max. The key property in this example is Oid.
- Add a View Controller to the WinForms module project (MySolution.Module.Win). If your solution does not contain this project, add the Controller to the WinForms application project (MySolution.Win).
- Access the WinDashboardViewerViewItem, as described in the How to: Access the Dashboard Control topic.
- In the ViewItem.ControlCreated event handler, subscribe to the DashboardViewer.DashboardItemControlCreated event.
- In the DashboardItemControlCreated event handler, access the DashboardViewer and subscribe to the DashboardViewer.DashboardItemDoubleClick event.
- In the DashboardItemDoubleClick event handler, get the key property value using the DashboardItemMouseActionEventArgs arguments.
- Add a ParametrizedAction to the Controller and force its execution in the DashboardItemDoubleClick event handler. The Action in the example is invisible because its category (“Dashboard”) does not match any existing Action Container. However, you still can execute it in code using the DoExecute method.
- In the ParametrizedAction.Execute event handler, create a new Object Space and find the clicked object using the IObjectSpace.FirstOrDefault method.
- Pass the found object to the XafApplication.CreateDetailView method to create a Detail View.
- Pass the created Detail View to the ShowViewParameters.CreatedView event argument to display it.
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
Add a key property to the hidden measures of a Dashboard and set its summary type to Min or Max. The key property in this example is Oid.
- Add a View Controller to the ASP.NET Web Forms module project.
- Access the WebDashboardViewerViewItem, as described in the How to: Access the Dashboard Control topic.
- Add a handler to the client-side ASPxClientDashboard.ItemClick event.
- In this event handler, get the key property value using the ASPxClientDashboardItemClickEventArgs arguments.
- Generate a callback on the client side (in the ASPxClientDashboard item click handler) and process it on the server side (see Custom UI Logic Using Client-Side Events and Server-Side Callbacks (ASP.NET Web Forms)).
- Add a ParametrizedAction to the Controller and force its execution in the IXafCallbackHandler.ProcessAction method implementation. The Action in the example is invisible because its category (“Dashboard”) does not match any existing Action Container. However, you still can execute it in code using the DoExecute method.
- In the ParametrizedAction.Execute event handler, create a new Object Space and find the clicked object using the IObjectSpace.FirstOrDefault method.
- Pass the found object to the XafApplication.CreateDetailView method to create a Detail View.
- Pass the created Detail View to the ShowViewParameters.CreatedView event argument to display it.
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;
}
}