2017-09-14 141 views
1

我正在用C#开发蜡烛图。如何在MS图表中显示各种数据的工具提示

我一直在使用当前datagridview的数据创建蜡烛图。

enter image description here

此外,当我将光标放在图表的蜡烛点上,我要显示在DataGridView的信息(开,关,高,低)。 (见图)

目前开发的源码。

DataTable table_ChartData = new DataTable(); 
    table_ChartData.Columns.Add("Id"); 
    table_ChartData.Columns.Add("Open"); 
    table_ChartData.Columns.Add("Close"); 
    table_ChartData.Columns.Add("High"); 
    table_ChartData.Columns.Add("Low"); 
    table_ChartData.Columns.Add("Day"); 
    dataGridView1.DataSource = table_ChartData; 

    chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineWidth = 1; 
    chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineWidth = 1; 
    chart1.ChartAreas["ChartArea1"].AxisY.Maximum = max; 
    chart1.ChartAreas["ChartArea1"].AxisY.Minimum = min; 

    chart1.Series["Daily"].XValueMember = "Day"; 
    chart1.Series["Daily"].YValueMembers = "High,Low,Open,Close"; 
    chart1.Series["Daily"].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Date; 

    chart1.Series["Daily"].CustomProperties = "PriceDownColor=Blue,PriceUpColor=Red"; 
    chart1.Series["Daily"]["OpenCloseStyle"] = "Triangle"; 
    chart1.Series["Daily"]["ShowOpenClose"] = "Both"; 

    chart1.DataSource = table_ChartData; 
    chart1.DataBind(); 

    private void chart1_MouseMove(object sender, MouseEventArgs e) 
    { 

     Point mousePoint = new Point(e.X, e.Y); 
     chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint, true); 
     chart1.ChartAreas[0].CursorY.SetCursorPixelPosition(mousePoint, true);` 

     var pos = e.Location; 
     if (prevPosition.HasValue && pos == prevPosition.Value) 
      return; 
     tooltip.RemoveAll(); 
     prevPosition = pos; 
     var results = chart1.HitTest(pos.X, pos.Y, false, ChartElementType.DataPoint); // set ChartElementType.PlottingArea for full area, not only DataPoints 
     foreach (var result in results) 
     { 
      if (result.ChartElementType == ChartElementType.DataPoint) // set ChartElementType.PlottingArea for full area, not only DataPoints 
      { 
       var yVal = result.ChartArea.AxisY.PixelPositionToValue(pos.Y); 
       tooltip.Show(((int)yVal).ToString(), chart1, pos.X, pos.Y - 15); 
      } 
     } 

    } 

谢谢你的帮忙。谢谢:)

回答

0

您正在创建ToolTipsMouseMove;这是一种方式,但最简单的方法就是让图表通过设置DataPoint.Tooltip产权做的工作,当你创建DataPoints ..:

DataPoint dp = new DataPoint (..); 
dp.ToolTip = "x=" + dp.XValue + "\n high=" + dp.YValues[0]+ "\n low=" + dp.YValues[1] + ..; 
yourSeries.Points.Add(dp); 

..或者,如果点是DataBound要么在绑定之后立即添加ToolTips,或者将它们包含在绑定本身中。

请注意,只有一部分various data binding methods可让您像工具提示一样绑定“扩展图表属性”。明确提到Points.DataBind。这意味着你需要准备现场为您的数据源的提示,因为我知道没有办法写在otherField字符串串联表达..

如果您有与下面的字段,你可以使用一个DataTable数据语法喜欢本作的结合:

var enumerableTable = (dt as System.ComponentModel.IListSource).GetList(); 
yourSeries.Points.DataBind(enumerableTable, "x-col", 
          "highField, lowField..", "Tooltip=tooltipField"); 

如果你想这样做的MouseMove就可以轻松搞定DataPoint你是在一个参考,如果有的话,其所有的价值像上面工作..:

DataPoint dp = null; 
if (results.PointIndex >= 0 && results.ChartElementType == ChartElementType.DataPoint) 
{ 
    dp = results.Series.Points[hitt.PointIndex]; 
    string tText = "x=" + dp.XValue + "\n high=" + 
        dp.YValues[0]+ "\n low=" + dp.YValues[1] + ..; 
.. 
} 

请注意,HitTest结果是一个具有多个属性的对象。无需循环播放!

+0

TaW非常感谢。这很有帮助。 –

相关问题