如何创建亲子报表

本文关键字:报表 创建 何创建 | 更新日期: 2023-09-27 18:14:10

我尝试创建简单的winform报告(s)基于表从我的数据库。因为有许多聚合,我想创建一个父图表和可选的子图表。下面是绘制"parent"报告的核心

private bool DrawReport(DataTable dt)
    {
        string serieName;
        foreach (object itemChecked in checkedListBox1.CheckedItems)
        {
            serieName = itemChecked.ToString();
            chart1.Series.Add(serieName);
            chart1.Series[serieName].ChartType = SeriesChartType.Column;
            //chart1.Series[0].IsValueShownAsLabel = true;
        }
        chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 90;
        chart1.ChartAreas[0].AxisX.Interval = 1;
        chart1.ChartAreas[0].AxisY.MajorGrid.LineWidth = 0;
        chart1.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0;
        foreach (DataRow dr in dt.Rows)
            {
                string X = dr["DATE"].ToString() + "  " + dr["HOUR"].ToString();
                string Y = dr["MED"].ToString();
                try
                {
                    chart1.Series[SER].Points.AddXY(X, Y);
                }
                catch (Exception)
                {
                    throw;
                }
        }
        chart1.DataBind();
        chart1.Visible = true;
        return true;
    }

直到现在一切都很好。

如您所见,X轴标签包含时间段-实际上是4或6小时的时间段。重点是创建另一个图表"child one"。它会出现当我点击元素的serie。所以现在的问题是如何读取点击x轴元素的值(这实际上是日期字符串)到变量。我可以在工具提示

上显示这个值
chart1.Series[0].ToolTip = "#VALX"

,但我找不到方法来分配它的变量。

如何创建亲子报表

我建议你从MSDN下载图表示例,因为它对这些图表有很大的帮助。对于特定的问题,您可以使用Chart.HitTest来确定鼠标被点击(或移动)了哪个图表元素。类似于(我将此用于MouseMove,但您可以轻松地将其用于MouseClick或其他事件):

private void ChartMouseMove(object sender, MouseEventArgs e)
    {
        try
        {
            HitTestResult[] htrList = Chart.HitTest(e.X, e.Y, false, ChartElementType.DataPoint);
            // loop through all of the elements in htrList, and make the "child" chart
        }
        catch (Exception)
        {
            StatusLabelText = "";
        }
    }

如果单击的图表元素是DataPoint,那么您可以根据需要获得x和/或y值。您可能需要考虑的一件事是:您可能希望使用DateTime对象作为DataPoint的x值,而不是自己构造一个日期表示(string X = dr["DATE"].ToString() + " " + dr["HOUR"].ToString();),并将其格式化为适合显示的图表(chart. axisx)。Format = "mmddyy hh"(伪代码)。这将使在创建子图表时更容易匹配点。

另一点:根据所提供的代码,最后一行(chart.DataBind();)是不需要的。您从未为图表指定DataSource,而是手动添加DataPoints,因此不需要数据绑定。