2017-07-31 62 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值,但这使得图表看起来非常混乱)。