2017-07-31 96 views
0

我在Visual Studio中使用C#使用Dundas圖表。Dundas Charting C#條件色彩規則列

我有一個系列的圖表 - 圖表顯示系列的列。我目前使用下面的代碼添加系列:

public void AddSeries(string name, SeriesChartType type, IEnumerable xValues, IEnumerable yValues, bool showLabels = true) 
    { 
     Series s = new Series(); 
     s.Points.DataBindXY(xValues, yValues); 
     s.LegendText = name; 
     s.Type = type; 
     if (type == SeriesChartType.Line) s.Color = Color.FromArgb(139,0,0); 
     else s.Color = _palette[_chart.Series.Count < _palette.Length ? _chart.Series.Count : 0]; 
     s.ShowLabelAsValue = showLabels; 
     s.FontAngle = -90; 
     s.LabelFormat = string.IsNullOrWhiteSpace(_chart.ChartAreas["Default"].AxisY.LabelStyle.Format) ? "P0" : _chart.ChartAreas["Default"].AxisY.LabelStyle.Format; 
     s.Font = new Font("Arial", 5); 

     _chart.Series.Add(s); 
    } 

我想改變這取決於該列的值每列的顏色 - 這將是基於一個INT目標值。 例如,如果該列小於我們的目標值,它應顯示爲紅色,否則應顯示爲綠色。

你會如何推薦這樣做?

+0

不確定Dundas和MsChart之間的區別;他們似乎很相似。很有可能你需要在點數變化時重新設定點並設置每一種顏色。 - 一些擴展的屬性,如工具提示可以通過某些數據綁定方式來設置,但是顏色,我想不是。 – TaW

回答

0

我已經找到了合適的答案,這個解決方案的唯一問題是,根據x軸上的點數,列出現不同的寬度。

void GetColourCodedSeries(ChartHelper chartHelper, DataTable table, string groupingColumn, string valueColumn) 
    { 
     List<Color> _palette = new List<Color>(); 

     var x = table.AsEnumerable().Select(f => f.Field<string>(groupingColumn)).ToArray(); 

     foreach (DataRow row in table.Rows) 
     { 
      if (Convert.ToDecimal(row[valueColumn].ToString()) >= _availabilityTarget) _palette.Add(Color.FromArgb(0, 176, 80)); 
      else _palette.Add(Color.FromArgb(139, 0, 0)); 

      List<decimal?> y = new List<decimal?>(); 

      foreach(var value in x) 
      { 
       if (value == row[groupingColumn].ToString()) y.Add(Convert.ToDecimal(row[valueColumn].ToString())); 
       else y.Add(null); 
      } 

      chartHelper.AddSeries(SeriesChartType.Column, x, y, _palette.ToArray()); 
     } 
    } 

此代碼基於值爲列創建動態調色板。然後我在表中添加每行一列,當添加系列時,我包括所有可能的x值和每個值的1 y值 - 但是,只有一個y軸值具有實際值,所有其他人被標記爲空值(我嘗試使用0值,但這使得圖表看起來非常混亂)。