2017-09-14 57 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非常感謝。這很有幫助。 –

相關問題