我尝试根据数据库中的表创建简单的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"
但我找不到将其分配给变量的方法。
答案 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
,因此不需要数据绑定。