source: branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/StatisticsView.cs @ 10691

Last change on this file since 10691 was 10691, checked in by mleitner, 7 years ago

Autosize table columns and keep selection on refresh

File size: 7.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Windows.Forms;
25using HeuristicLab.Core.Views;
26using HeuristicLab.MainForm;
27
28namespace HeuristicLab.DataPreprocessing.Views {
29
30  [View("Statistics View")]
31  [Content(typeof(StatisticsContent), false)]
32  public partial class StatisticsView : ItemView {
33
34    private List<List<string>> columnsRowsMatrix;
35    private readonly int COLUMNS = 10;
36
37    public new StatisticsContent Content {
38      get { return (StatisticsContent)base.Content; }
39      set { base.Content = value; }
40    }
41
42    public StatisticsView() {
43      InitializeComponent();
44    }
45
46    protected override void OnContentChanged() {
47      base.OnContentChanged();
48      if (Content == null) {
49        txtRows.Text = "";
50        txtColumns.Text = "";
51        txtNumericColumns.Text = "";
52        txtNominalColumns.Text = "";
53        txtMissingValuesTotal.Text = "";
54        dataGridView.Columns.Clear();
55      } else {
56        UpdateData();
57      }
58    }
59
60    /// <summary>
61    /// Adds eventhandlers to the current instance.
62    /// </summary>
63    protected override void RegisterContentEvents() {
64      Content.Changed += Content_Changed;
65    }
66
67
68    /// <summary>
69    /// Removes the eventhandlers from the current instance.
70    /// </summary>
71    protected override void DeregisterContentEvents() {
72      Content.Changed -= Content_Changed;
73    }
74
75    private void UpdateData() {
76      var logic = Content.StatisticsLogic;
77      txtRows.Text = logic.GetRowCount().ToString();
78      txtColumns.Text = logic.GetColumnCount().ToString();
79      txtNumericColumns.Text = logic.GetNumericColumnCount().ToString();
80      txtNominalColumns.Text = logic.GetNominalColumnCount().ToString();
81      txtMissingValuesTotal.Text = logic.GetMissingValueCount().ToString();
82
83      columnsRowsMatrix = new List<List<string>>();
84      DataGridViewColumn[] columns = new DataGridViewColumn[10];
85      for (int i = 0; i < COLUMNS; ++i) {
86        var column = new DataGridViewTextBoxColumn();
87        column.FillWeight = 1;
88        columns[i] = column;
89      }
90
91      columns[0].HeaderCell.Value = "Type";
92      columns[1].HeaderCell.Value = "Missing Values";
93      columns[2].HeaderCell.Value = "Min";
94      columns[3].HeaderCell.Value = "Max";
95      columns[4].HeaderCell.Value = "Median";
96      columns[5].HeaderCell.Value = "Average";
97      columns[6].HeaderCell.Value = "std. Deviation";
98      columns[7].HeaderCell.Value = "Variance";
99      columns[8].HeaderCell.Value = "Most Common Value";
100      columns[9].HeaderCell.Value = "Num. diff. Values";
101
102      for (int i = 0; i < logic.GetColumnCount(); ++i) {
103        columnsRowsMatrix.Add(GetList(i));
104      }
105
106      dataGridView.Columns.Clear();
107      dataGridView.Columns.AddRange(columns);
108      dataGridView.RowCount = columnsRowsMatrix.Count;
109
110      for (int i = 0; i < columnsRowsMatrix.Count; ++i) {
111        dataGridView.Rows[i].HeaderCell.Value = logic.GetVariableName(i);
112      }
113
114      dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
115      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
116      dataGridView.AllowUserToResizeColumns = true;
117    }
118
119    private List<string> GetList(int i) {
120      List<string> list;
121      var logic = Content.StatisticsLogic;
122      if (logic.IsType<double>(i)) {
123        list = GetDoubleColumns(i);
124      } else if (logic.IsType<string>(i)) {
125        list = GetStringColumns(i);
126      } else if (logic.IsType<DateTime>(i)) {
127        list = GetDateTimeColumns(i);
128      } else {
129        list = new List<string>();
130        for (int j = 0; j < COLUMNS; ++j) {
131          list.Add("unknown column type");
132        }
133      }
134      return list;
135    }
136
137    private List<string> GetDoubleColumns(int columnIndex) {
138      var logic = Content.StatisticsLogic;
139      return new List<string> {
140        logic.GetColumnTypeAsString(columnIndex),
141        logic.GetMissingValueCount(columnIndex).ToString(),
142        logic.GetMin<double>(columnIndex).ToString(),
143        logic.GetMax<double>(columnIndex).ToString(),
144        logic.GetMedian(columnIndex).ToString(),
145        logic.GetAverage(columnIndex).ToString(),
146        logic.GetStandardDeviation(columnIndex).ToString(),
147        logic.GetVariance(columnIndex).ToString(),
148        logic.GetMostCommonValue<double>(columnIndex).ToString(),
149        logic.GetDifferentValuesCount<double>(columnIndex).ToString()
150      };
151    }
152
153    private List<string> GetStringColumns(int columnIndex) {
154      var logic = Content.StatisticsLogic;
155      return new List<string> {
156        logic.GetColumnTypeAsString(columnIndex),
157        logic.GetMissingValueCount(columnIndex).ToString(),
158        "", //min
159        "", //max
160        "", //median
161        "", //average
162        "", //standard deviation
163        "", //variance
164        logic.GetMostCommonValue<string>(columnIndex).ToString(),
165        logic.GetDifferentValuesCount<string>(columnIndex).ToString()
166      };
167    }
168
169    private List<string> GetDateTimeColumns(int columnIndex) {
170      var logic = Content.StatisticsLogic;
171      return new List<string> {
172        logic.GetColumnTypeAsString(columnIndex),
173        logic.GetMissingValueCount(columnIndex).ToString(),
174        logic.GetMin<DateTime>(columnIndex).ToString(),
175        logic.GetMax<DateTime>(columnIndex).ToString(),
176        logic.GetMedianDateTime(columnIndex).ToString(),
177        logic.GetAverageDateTime(columnIndex).ToString(),
178        logic.GetStandardDeviation(columnIndex).ToString(),
179        logic.GetVariance(columnIndex).ToString(), //variance
180        logic.GetMostCommonValue<DateTime>(columnIndex).ToString(),
181        logic.GetDifferentValuesCount<DateTime>(columnIndex).ToString()
182      };
183    }
184
185    private List<string> GetDoubleColums(int i) {
186      throw new NotImplementedException();
187    }
188
189    private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
190      if (Content != null && e.RowIndex < columnsRowsMatrix.Count && e.ColumnIndex < columnsRowsMatrix[0].Count) {
191        e.Value = columnsRowsMatrix[e.RowIndex][e.ColumnIndex];
192      }
193    }
194
195    private void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
196      switch (e.Type) {
197        case DataPreprocessingChangedEventType.DeleteColumn:
198          columnsRowsMatrix.RemoveAt(e.Column);
199          break;
200        case DataPreprocessingChangedEventType.AddColumn:
201          columnsRowsMatrix.Insert(e.Row, GetList(e.Column));
202          dataGridView.RowCount++;
203          break;
204        case DataPreprocessingChangedEventType.ChangeItem:
205          columnsRowsMatrix[e.Column] = GetList(e.Column);
206          break;
207        case DataPreprocessingChangedEventType.DeleteRow:
208        case DataPreprocessingChangedEventType.AddRow:
209          for (int i = 0; i < columnsRowsMatrix.Count; ++i) {
210            columnsRowsMatrix[i] = GetList(e.Column);
211          }
212          break;
213      }
214      dataGridView.Refresh();
215    }
216  }
217}
Note: See TracBrowser for help on using the repository browser.