Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/21/14 11:12:31 (10 years ago)
Author:
mleitner
Message:

Add colors to histogram / remove all in one mode

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/PreprocessingDataTableView.cs

    r10851 r10867  
    3131using HeuristicLab.MainForm;
    3232
    33 namespace HeuristicLab.Analysis.Views {
     33namespace HeuristicLab.Analysis.Views
     34{
    3435  [View("Preprocessing DataTable View")]
    3536  [Content(typeof(PreprocessingDataTable), false)]
    36   public partial class PreprocessingDataTableView : ItemView, IConfigureableView {
     37  public partial class PreprocessingDataTableView : ItemView, IConfigureableView
     38  {
    3739    protected List<Series> invisibleSeries;
    3840    protected Dictionary<IObservableList<double>, DataRow> valuesRowsTable;
    3941
    40     public new PreprocessingDataTable Content {
     42    public new PreprocessingDataTable Content
     43    {
    4144      get { return (PreprocessingDataTable)base.Content; }
    4245      set { base.Content = value; }
    4346    }
    4447
    45     public PreprocessingDataTableView() {
     48    public List<double> classification { get; set; }
     49
     50    public PreprocessingDataTableView()
     51    {
    4652      InitializeComponent();
    4753      valuesRowsTable = new Dictionary<IObservableList<double>, DataRow>();
     
    5258
    5359    #region Event Handler Registration
    54     protected override void DeregisterContentEvents() {
     60    protected override void DeregisterContentEvents()
     61    {
    5562      foreach (DataRow row in Content.Rows)
    5663        DeregisterDataRowEvents(row);
     
    6774      base.DeregisterContentEvents();
    6875    }
    69     protected override void RegisterContentEvents() {
     76    protected override void RegisterContentEvents()
     77    {
    7078      base.RegisterContentEvents();
    7179      Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
     
    92100      row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset);
    93101    }
    94     protected virtual void DeregisterDataRowEvents(DataRow row) {
     102    protected virtual void DeregisterDataRowEvents(DataRow row)
     103    {
    95104      row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded);
    96105      row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved);
     
    104113    #endregion
    105114
    106     protected override void OnContentChanged() {
     115    protected override void OnContentChanged()
     116    {
    107117      base.OnContentChanged();
    108118      invisibleSeries.Clear();
     
    111121      chart.ChartAreas[0].AxisY2.Title = string.Empty;
    112122      chart.Series.Clear();
    113       if (Content != null) {
     123      if (Content != null)
     124      {
     125
     126        if (classification != null)
     127        {
     128          chart.Titles[0].Text = Content.Name;
     129        }
    114130
    115131        AddDataRows(Content.Rows);
     
    120136    }
    121137
    122     protected override void SetEnabledStateOfControls() {
     138    protected override void SetEnabledStateOfControls()
     139    {
    123140      base.SetEnabledStateOfControls();
    124141      chart.Enabled = Content != null;
    125142    }
    126143
    127     public void ShowConfiguration() {
    128       if (Content != null) {
    129         using (var dialog = new DataTableVisualPropertiesDialog(Content)) {
     144    public void ShowConfiguration()
     145    {
     146      if (Content != null)
     147      {
     148        using (var dialog = new DataTableVisualPropertiesDialog(Content))
     149        {
    130150          dialog.ShowDialog(this);
    131151        }
    132       } else MessageBox.Show("Nothing to configure.");
    133     }
    134     protected virtual void AddDataRows(IEnumerable<DataRow> rows) {
    135       foreach (var row in rows) {
     152      }
     153      else MessageBox.Show("Nothing to configure.");
     154    }
     155    protected virtual void AddDataRows(IEnumerable<DataRow> rows)
     156    {
     157      foreach (var row in rows)
     158      {
    136159        RegisterDataRowEvents(row);
    137160        var series = new Series(row.Name);
     
    140163        ConfigureSeries(series, row);
    141164        FillSeriesWithRowValues(series, row);
    142         chart.Series.Add(series);
     165
     166        if (classification == null)
     167        {
     168          chart.Series.Add(series);
     169        }
    143170      }
    144171
     
    172199          ConfigureSeries(series, row);
    173200          FillSeriesWithRowValues(series, row);
    174           chart.Series.Add(series);
     201
     202          if (classification == null)
     203          {
     204            chart.Series.Add(series);
     205          }
     206
    175207        }
    176208      }
     
    202234    }
    203235
    204     private void ConfigureSeries(Series series, DataRow row) {
     236    private void ConfigureSeries(Series series, DataRow row)
     237    {
    205238      RemoveCustomPropertyIfExists(series, "PointWidth");
    206239      series.BorderWidth = 1;
     
    223256          if (!chart.Series.Any(x => x.ChartType != SeriesChartType.Bar && x.ChartType != SeriesChartType.StackedBar && x.ChartType != SeriesChartType.StackedBar100))
    224257            series.ChartType = SeriesChartType.Bar;
    225           else {
     258          else
     259          {
    226260            series.ChartType = SeriesChartType.FastPoint; //default
    227261            row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
     
    235269          break;
    236270        case DataRowVisualProperties.DataRowChartType.Histogram:
    237           series.ChartType = SeriesChartType.Column;
     271          series.ChartType = SeriesChartType.StackedColumn;
    238272          series.SetCustomProperty("PointWidth", "1");
    239273          if (!series.Color.IsEmpty && series.Color.GetBrightness() < 0.25)
     
    267301    }
    268302
    269     private void ConfigureChartArea(ChartArea area) {
     303    private void ConfigureChartArea(ChartArea area)
     304    {
    270305      if (Content.VisualProperties.TitleFont != null) chart.Titles[0].Font = Content.VisualProperties.TitleFont;
    271306      if (!Content.VisualProperties.TitleColor.IsEmpty) chart.Titles[0].ForeColor = Content.VisualProperties.TitleColor;
     
    294329    }
    295330
    296     private void RecalculateAxesScale(ChartArea area) {
     331    private void RecalculateAxesScale(ChartArea area)
     332    {
    297333      // Reset the axes bounds so that RecalculateAxesScale() will assign new bounds
    298       foreach (Axis a in area.Axes) {
     334      foreach (Axis a in area.Axes)
     335      {
    299336        a.Minimum = double.NaN;
    300337        a.Maximum = double.NaN;
     
    318355    }
    319356
    320     protected virtual void UpdateYCursorInterval() {
     357    protected virtual void UpdateYCursorInterval()
     358    {
    321359      double interestingValuesRange = (
    322360        from series in chart.Series
     
    337375    #region Event Handlers
    338376    #region Content Event Handlers
    339     private void Content_VisualPropertiesChanged(object sender, EventArgs e) {
     377    private void Content_VisualPropertiesChanged(object sender, EventArgs e)
     378    {
    340379      if (InvokeRequired)
    341380        Invoke(new EventHandler(Content_VisualPropertiesChanged), sender, e);
    342       else {
     381      else
     382      {
    343383        ConfigureChartArea(chart.ChartAreas[0]);
    344384        RecalculateAxesScale(chart.ChartAreas[0]); // axes min/max could have changed
     
    386426      if (InvokeRequired)
    387427        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded), sender, e);
    388       else {
     428      else
     429      {
    389430        AddDataRows(e.Items);
    390431      }
    391432    }
    392     private void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
     433    private void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataRow> e)
     434    {
    393435      if (InvokeRequired)
    394436        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved), sender, e);
    395       else {
     437      else
     438      {
    396439        RemoveDataRows(e.Items);
    397440      }
    398441    }
    399     private void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
     442    private void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<DataRow> e)
     443    {
    400444      if (InvokeRequired)
    401445        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced), sender, e);
    402       else {
     446      else
     447      {
    403448        RemoveDataRows(e.OldItems);
    404449        AddDataRows(e.Items);
    405450      }
    406451    }
    407     private void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
     452    private void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<DataRow> e)
     453    {
    408454      if (InvokeRequired)
    409455        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset), sender, e);
    410       else {
     456      else
     457      {
    411458        RemoveDataRows(e.OldItems);
    412459        AddDataRows(e.Items);
     
    415462    #endregion
    416463    #region Row Event Handlers
    417     private void Row_VisualPropertiesChanged(object sender, EventArgs e) {
     464    private void Row_VisualPropertiesChanged(object sender, EventArgs e)
     465    {
    418466      if (InvokeRequired)
    419467        Invoke(new EventHandler(Row_VisualPropertiesChanged), sender, e);
    420       else {
     468      else
     469      {
    421470        DataRow row = (DataRow)sender;
    422471        Series series = chart.Series[row.Name];
     
    427476      }
    428477    }
    429     private void Row_NameChanged(object sender, EventArgs e) {
     478    private void Row_NameChanged(object sender, EventArgs e)
     479    {
    430480      if (InvokeRequired)
    431481        Invoke(new EventHandler(Row_NameChanged), sender, e);
    432       else {
     482      else
     483      {
    433484        DataRow row = (DataRow)sender;
    434485        chart.Series[row.Name].Name = row.Name;
     
    437488    #endregion
    438489    #region Values Event Handlers
    439     private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
     490    private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e)
     491    {
    440492      if (InvokeRequired)
    441493        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded), sender, e);
    442       else {
     494      else
     495      {
    443496        DataRow row = null;
    444497        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
    445         if (row != null) {
     498        if (row != null)
     499        {
    446500          Series rowSeries = chart.Series[row.Name];
    447           if (!invisibleSeries.Contains(rowSeries)) {
     501          if (!invisibleSeries.Contains(rowSeries))
     502          {
    448503            rowSeries.Points.Clear();
    449504            FillSeriesWithRowValues(rowSeries, row);
     
    454509      }
    455510    }
    456     private void Values_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
     511    private void Values_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e)
     512    {
    457513      if (InvokeRequired)
    458514        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved), sender, e);
    459       else {
     515      else
     516      {
    460517        DataRow row = null;
    461518        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
    462         if (row != null) {
     519        if (row != null)
     520        {
    463521          Series rowSeries = chart.Series[row.Name];
    464           if (!invisibleSeries.Contains(rowSeries)) {
     522          if (!invisibleSeries.Contains(rowSeries))
     523          {
    465524            rowSeries.Points.Clear();
    466525            FillSeriesWithRowValues(rowSeries, row);
     
    471530      }
    472531    }
    473     private void Values_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
     532    private void Values_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e)
     533    {
    474534      if (InvokeRequired)
    475535        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced), sender, e);
    476       else {
     536      else
     537      {
    477538        DataRow row = null;
    478539        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
    479         if (row != null) {
     540        if (row != null)
     541        {
    480542          Series rowSeries = chart.Series[row.Name];
    481           if (!invisibleSeries.Contains(rowSeries)) {
    482             if (row.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram) {
     543          if (!invisibleSeries.Contains(rowSeries))
     544          {
     545            if (row.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram)
     546            {
    483547              rowSeries.Points.Clear();
    484548              FillSeriesWithRowValues(rowSeries, row);
    485             } else {
    486               foreach (IndexedItem<double> item in e.Items) {
     549            }
     550            else
     551            {
     552              foreach (IndexedItem<double> item in e.Items)
     553              {
    487554                if (IsInvalidValue(item.Value))
    488555                  rowSeries.Points[item.Index].IsEmpty = true;
    489                 else {
     556                else
     557                {
    490558                  rowSeries.Points[item.Index].YValues = new double[] { item.Value };
    491559                  rowSeries.Points[item.Index].IsEmpty = false;
     
    499567      }
    500568    }
    501     private void Values_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
     569    private void Values_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e)
     570    {
    502571      if (InvokeRequired)
    503572        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved), sender, e);
    504       else {
     573      else
     574      {
    505575        DataRow row = null;
    506576        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
    507         if (row != null) {
     577        if (row != null)
     578        {
    508579          Series rowSeries = chart.Series[row.Name];
    509           if (!invisibleSeries.Contains(rowSeries)) {
     580          if (!invisibleSeries.Contains(rowSeries))
     581          {
    510582            rowSeries.Points.Clear();
    511583            FillSeriesWithRowValues(rowSeries, row);
     
    517589    }
    518590
    519     private void Values_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
     591    private void Values_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e)
     592    {
    520593      if (InvokeRequired)
    521594        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset), sender, e);
    522       else {
     595      else
     596      {
    523597        DataRow row = null;
    524598        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
    525         if (row != null) {
     599        if (row != null)
     600        {
    526601          Series rowSeries = chart.Series[row.Name];
    527           if (!invisibleSeries.Contains(rowSeries)) {
     602          if (!invisibleSeries.Contains(rowSeries))
     603          {
    528604            rowSeries.Points.Clear();
    529605            FillSeriesWithRowValues(rowSeries, row);
     
    538614
    539615    #region Chart Event Handlers
    540     private void chart_MouseDown(object sender, MouseEventArgs e) {
     616    private void chart_MouseDown(object sender, MouseEventArgs e)
     617    {
    541618      HitTestResult result = chart.HitTest(e.X, e.Y);
    542       if (result.ChartElementType == ChartElementType.LegendItem) {
     619      if (result.ChartElementType == ChartElementType.LegendItem)
     620      {
    543621        ToggleSeriesVisible(result.Series);
    544622      }
    545623    }
    546     private void chart_MouseMove(object sender, MouseEventArgs e) {
     624    private void chart_MouseMove(object sender, MouseEventArgs e)
     625    {
    547626      HitTestResult result = chart.HitTest(e.X, e.Y);
    548627      if (result.ChartElementType == ChartElementType.LegendItem)
     
    551630        this.Cursor = Cursors.Default;
    552631    }
    553     private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
    554       foreach (LegendItem legendItem in e.LegendItems) {
     632    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e)
     633    {
     634      foreach (LegendItem legendItem in e.LegendItems)
     635      {
    555636        var series = chart.Series[legendItem.SeriesName];
    556         if (series != null) {
     637        if (series != null)
     638        {
    557639          bool seriesIsInvisible = invisibleSeries.Contains(series);
    558           foreach (LegendCell cell in legendItem.Cells) {
     640          foreach (LegendCell cell in legendItem.Cells)
     641          {
    559642            cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black;
    560643          }
     
    564647    #endregion
    565648
    566     private void ToggleSeriesVisible(Series series) {
    567       if (!invisibleSeries.Contains(series)) {
     649    private void ToggleSeriesVisible(Series series)
     650    {
     651      if (!invisibleSeries.Contains(series))
     652      {
    568653        series.Points.Clear();
    569654        invisibleSeries.Add(series);
    570       } else {
     655      }
     656      else
     657      {
    571658        invisibleSeries.Remove(series);
    572         if (Content != null) {
     659        if (Content != null)
     660        {
    573661
    574662          var row = (from r in Content.Rows
     
    583671    }
    584672
    585     private void FillSeriesWithRowValues(Series series, DataRow row) {
    586       switch (row.VisualProperties.ChartType) {
     673    private void FillSeriesWithRowValues(Series series, DataRow row)
     674    {
     675      switch (row.VisualProperties.ChartType)
     676      {
    587677        case DataRowVisualProperties.DataRowChartType.Histogram:
    588678          CalculateHistogram(series, row);
    589679          break;
    590         default: {
     680        default:
     681          {
    591682            bool yLogarithmic = series.YAxisType == AxisType.Primary
    592683                                  ? Content.VisualProperties.YAxisLogScale
     
    595686                                  ? Content.VisualProperties.XAxisLogScale
    596687                                  : Content.VisualProperties.SecondXAxisLogScale;
    597             for (int i = 0; i < row.Values.Count; i++) {
     688            for (int i = 0; i < row.Values.Count; i++)
     689            {
    598690              var value = row.Values[i];
    599691              var point = new DataPoint();
     
    614706      double min = Double.MaxValue;
    615707
    616       foreach (double value in values) {
     708      foreach (double value in values)
     709      {
    617710        if (!Double.IsNaN(value) && value < min)
    618711          min = value;
     
    622715
    623716    //get maximium ignores nan values
    624     private double GetMaximum(IEnumerable<double> values) {
     717    private double GetMaximum(IEnumerable<double> values)
     718    {
    625719      double max = Double.MinValue;
    626720
    627       foreach (double value in values) {
     721      foreach (double value in values)
     722      {
    628723        if (!Double.IsNaN(value) && value > max)
    629724          max = value;
     
    632727    }
    633728
    634     protected virtual void CalculateHistogram(Series series, DataRow row) {
    635       series.Points.Clear();
     729    protected virtual void CalculateHistogram(Series series, DataRow row)
     730    {
     731      if (classification != null)
     732      {
     733
     734        var qry = row.Values.Select((i, index) => new { i, j = classification[index] })
     735                           .GroupBy((x) => x.j).ToDictionary(x => x.Key, x => x.Select(v => v.i).ToList());
     736        chart.Titles.Add(row.Name);
     737        foreach (KeyValuePair<double, List<double>> entry in qry)
     738        {
     739          var s = new Series(row.Name + entry.Key);
     740
     741          ConfigureSeries(s, row);
     742          AddPointsToHistogramSeries(s, row, entry.Value);
     743
     744          s.LegendText = entry.Key.ToString();
     745
     746          chart.Series.Add(s);
     747        }
     748      }
     749      else
     750      {
     751        series.Points.Clear();
     752        ConfigureSeries(series, row);
     753        AddPointsToHistogramSeries(series, row, null);
     754      }
     755    }
     756
     757    private void AddPointsToHistogramSeries(Series series, DataRow row, List<double> values)
     758    {
     759
    636760      if (!row.Values.Any()) return;
    637761      int bins = row.VisualProperties.Bins;
     
    641765      double intervalWidth = (maxValue - minValue) / bins;
    642766      if (intervalWidth < 0) return;
    643       if (intervalWidth == 0) {
     767      if (intervalWidth == 0)
     768      {
    644769        series.Points.AddXY(minValue, row.Values.Count);
    645770        return;
     
    673798      var doubleRange = DoubleRange(min, max, intervalWidth).Skip(1).ToList();
    674799
     800
     801      if (values == null) {
     802        values = row.Values.ToList(); ;
     803      }
     804
    675805      // aggregate the row values by unique key and frequency value
    676       var valueFrequencies = (from v in row.Values
     806      var valueFrequencies = (from v in values
    677807                              where !IsInvalidValue(v)
    678808                              orderby v
     
    680810                              select new Tuple<double, double>(g.First(), g.Count())).ToList();
    681811
    682       // shift the chart to the left so the bars are placed on the intervals
    683       if (valueFrequencies.First().Item1 < doubleRange.First())
     812      //  shift the chart to the left so the bars are placed on the intervals
     813      if (classification != null || valueFrequencies.First().Item1 < doubleRange.First()) {
    684814        series.Points.Add(new DataPoint(min - intervalWidth, 0));
     815        series.Points.Add(new DataPoint(max + intervalWidth, 0));
     816      }
    685817
    686818      // add data points
    687819      int j = 0;
    688       foreach (var d in doubleRange) {
     820      foreach (var d in doubleRange)
     821      {
    689822        double sum = 0.0;
    690823        // sum the frequency values that fall within the same interval
    691         while (j < valueFrequencies.Count && valueFrequencies[j].Item1 < d) {
     824        while (j < valueFrequencies.Count && valueFrequencies[j].Item1 < d)
     825        {
    692826          sum += valueFrequencies[j].Item2;
    693827          ++j;
     
    699833                              ? "Y"
    700834                              : Content.VisualProperties.YAxisTitle;
    701         series.Points.Add(new DataPoint(d - intervalCenter, sum) {
     835        series.Points.Add(new DataPoint(d - intervalCenter, sum)
     836        {
    702837          ToolTip =
    703838            xAxisTitle + ": [" + (d - intervalWidth) + "-" + d + ")" + Environment.NewLine +
     
    708843
    709844    #region Helpers
    710     public static IEnumerable<double> DoubleRange(double min, double max, double step) {
     845    public static IEnumerable<double> DoubleRange(double min, double max, double step)
     846    {
    711847      double i;
    712848      for (i = min; i <= max; i += step)
     
    717853    }
    718854
    719     protected void RemoveCustomPropertyIfExists(Series series, string property) {
     855    protected void RemoveCustomPropertyIfExists(Series series, string property)
     856    {
    720857      if (series.IsCustomPropertySet(property)) series.DeleteCustomProperty(property);
    721858    }
    722859
    723     private double HumanRoundRange(double range) {
     860    private double HumanRoundRange(double range)
     861    {
    724862      double base10 = Math.Pow(10.0, Math.Floor(Math.Log10(range)));
    725863      double rounding = range / base10;
     
    732870    }
    733871
    734     private double HumanRoundMax(double max) {
     872    private double HumanRoundMax(double max)
     873    {
    735874      double base10;
    736875      if (max > 0) base10 = Math.Pow(10.0, Math.Floor(Math.Log10(max)));
     
    741880    }
    742881
    743     private ChartDashStyle ConvertLineStyle(DataRowVisualProperties.DataRowLineStyle dataRowLineStyle) {
    744       switch (dataRowLineStyle) {
     882    private ChartDashStyle ConvertLineStyle(DataRowVisualProperties.DataRowLineStyle dataRowLineStyle)
     883    {
     884      switch (dataRowLineStyle)
     885      {
    745886        case DataRowVisualProperties.DataRowLineStyle.Dash:
    746887          return ChartDashStyle.Dash;
     
    760901    }
    761902
    762     protected static bool IsInvalidValue(double x) {
     903    protected static bool IsInvalidValue(double x)
     904    {
    763905      return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue;
    764906    }
Note: See TracChangeset for help on using the changeset viewer.