如何创建父子报告

时间:2014-07-22 08:16:21

标签: c# charts report mschart

我尝试根据数据库中的表创建简单的winform报告。因为有很多聚合,我想创建一个父图表和可选的子图表。 以下是吸引父母"的核心。报告

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"。当我点击系列元素时会出现。所以现在问题是如何将点击的x轴元素(实际上是日期字符串)的值读取到变量。我可以在工具提示上显示这个值

chart1.Series[0].ToolTip = "#VALX"

但我找不到将其分配给变量的方法。

1 个答案:

答案 0 :(得分:1)

我建议你从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值。您可能想要考虑的一件事:您可能希望使用string X = dr["DATE"].ToString() + " " + dr["HOUR"].ToString();对象作为DateTime的x值,而不是自己构建日期表示(DataPoint),而只是将图表格式适当地显示(chart.AxisX.Format =" mmddyy hh"伪代码)。这将使创建子图表时更容易匹配点。

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