本指南演示了如何创建 drill-down (向下钻取) 图表,以便于在相同的图表中显示主/从数据。 两个系列被用于完成此任务。 通过单击第一个系列的点,显示另一个系列来呈现被单击点的详细数据。
注意 |
---|
在 DevExpress Code Central 数据库中可以找到完整的示例项目,链接是 如何创建 drill-down 图表 (WinForms 版) 和 如何实现多维 DrillDown 功能 (ASP.NET 版)。 可以在线运行此示例,或者下载自动可执行的示例。 |
要创建 drill-down 图表,则执行下列操作。
创建图表并绑定到数据
-
启动 MS Visual Studio (2005、2008 或 2010),并且新建一个或者打开一个现有的 Windows 窗体应用程序。
-
把图表绑定到 nwind.mdb 示例数据库的“SalesPerson”视图。 相关的按步骤操作指南,请执行下列指南的步骤 1 - 7: 如何: 把各个图表系列绑定到数据。
-
为了创建系列,单击图表的智能标记,并在操作列表中选择 Series(系列)... 项。 然后,Series Collection Editor(系列集合编辑器) 将被调用。
在此对话框中,单击 Add(添加)... 按钮,创建 饼图 视图类型的第一个系列。
切换到对话框的 属性 标签页,并把此系列的 Series.DataSource 属性设置为 salesPersonBindingSource、把 SeriesBase.ArgumentDataMember 属性设置为 SalesPerson、把 SeriesBase.SummaryFunction 属性设置为 SUM([Extended Price])。
-
现在,添加第二个系列 —— 条形 视图类型。 您将看到红色的通知信息,提示此视图与集合中的第一个可视系列不兼容。 因此,禁用此系列的 SeriesBase.Visible 属性 —— 我们将在接下来的代码中替换这两个系列。
像第一个系列那样,把第二个系列的 Series.DataSource 属性设置为 salesPersonBindingSource、把 SeriesBase.ArgumentDataMember 属性设置为 CategoryName、并把 SeriesBase.SummaryFunction 属性设置为 SUM([Extended Price])。
另外,通过条形系列的 SeriesBase.DataFilters 属性,来指定一个 数据筛选,其中 DataFilter.ColumnName 属性值被设置为 SalesPerson。
调整图表
-
为了添加 图表标题,而选中图表,并单击其 ChartControl.Titles 属性的省略号按钮。
在被调用的 Chart Title Collection Editor(图表标题集合编辑器) 中,单击 Add(添加) 按钮来创建一个标题。 把它的 Title.Text 属性设置为 "Back to the main view...",并把 TitleBase.Visible 属性设置为 false。
添加另一个图表标题 (标题文本为 "Sales by Person"),并使它可视。
-
对于第一个 (饼图) 系列,把它的 PointOptions.ValueNumericOptions 属性设置为 Percent。
同时,在它的 SeriesBase.LegendPointOptions 属性中,禁用 PercentOptions.ValueAsPercent 属性,并把 PointOptions.PointView 属性设置为 Argument。
接管 MouseClick 事件
现在,只剩下接管 chartControl1.MouseClick 事件了。 编写下列代码。
C# | 复制代码 |
---|---|
using System; using System.Drawing; using System.Windows.Forms; using DevExpress.XtraCharts; // ... private void chartControl1_MouseClick(object sender, MouseEventArgs e) { // Obtain the object being clicked. ChartHitInfo hi = chartControl1.CalcHitInfo(e.X, e.Y); // Check whether it was a series point, and if so - // obtain its argument, and pass it to the detail series. SeriesPoint point = hi.SeriesPoint; if (point != null) { string argument = point.Argument.ToString(); // Flip the series. if (chartControl1.Series[0].Visible == true) { chartControl1.Series[0].Visible = false; chartControl1.Series[1].Name = argument; chartControl1.Series[1].Visible = true; // Since the new series determines another diagram's type, // you should re-define the axes properties. XYDiagram diagram = (XYDiagram)chartControl1.Diagram; diagram.AxisX.Label.Angle = -25; diagram.AxisX.Label.Antialiasing = true; diagram.AxisY.NumericOptions.Format = NumericFormat.Currency; diagram.AxisY.NumericOptions.Precision = 0; chartControl1.Series[1].DataFilters[0].Value = argument; chartControl1.Titles[0].Visible = true; chartControl1.Titles[1].Text = "Personal Sales by Categories"; } } // Obtain the title under the test point. ChartTitle link = hi.ChartTitle; // Check whether the link was clicked, and if so - // restore the main series. if (link != null && link.Text.StartsWith("Back")) { chartControl1.Series[0].Visible = true; chartControl1.Series[1].Visible = false; link.Visible = false; chartControl1.Titles[1].Text = "Sales by Person"; } } |
Visual Basic | 复制代码 |
---|---|
Imports System Imports System.Drawing Imports System.Windows.Forms Imports DevExpress.XtraCharts ' ... Private Sub chartControl1_MouseClick(ByVal sender As Object, _ ByVal e As MouseEventArgs) Handles chartControl1.MouseClick ' Obtain the object being clicked. Dim hi As ChartHitInfo = chartControl1.CalcHitInfo(e.X, e.Y) ' Check whether it was a series point, and if so - ' obtain its argument, and pass it to the detail series. Dim point As SeriesPoint = hi.SeriesPoint If point IsNot Nothing Then Dim argument As String = point.Argument.ToString() ' Flip the series. If chartControl1.Series(0).Visible = True Then chartControl1.Series(0).Visible = False chartControl1.Series(1).Name = argument chartControl1.Series(1).Visible = True ' Since the new series determines another diagram's type, ' you should re-define axes properties. Dim diagram As XYDiagram = CType(chartControl1.Diagram, XYDiagram) diagram.AxisX.Label.Angle = -25 diagram.AxisX.Label.Antialiasing = True diagram.AxisY.NumericOptions.Format = NumericFormat.Currency diagram.AxisY.NumericOptions.Precision = 0 chartControl1.Series(1).DataFilters(0).Value = argument chartControl1.Titles(0).Visible = True chartControl1.Titles(1).Text = "Personal Sales by Categories" End If End If ' Obtain the title under the test point. Dim link As ChartTitle = hi.ChartTitle ' Check whether the link was clicked, and if so - ' restore the main series. If link IsNot Nothing AndAlso link.Text.StartsWith("Back") Then chartControl1.Series(0).Visible = True chartControl1.Series(1).Visible = False link.Visible = False chartControl1.Titles(1).Text = "Sales by Person" End If End Sub |
查看运行结果
在下面的插图中显示了结果。