Changeset 3314


Ignore:
Timestamp:
04/12/10 18:12:55 (11 years ago)
Author:
mkommend
Message:

implemented first version of multiple column sorting in !IStringConvertibleMatrixView(ticket #968)

Location:
trunk/sources/HeuristicLab.Data.Views/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.Designer.cs

    r3312 r3314  
    9494      this.dataGridView.VirtualMode = true;
    9595      this.dataGridView.Scroll += new System.Windows.Forms.ScrollEventHandler(this.dataGridView_Scroll);
     96      this.dataGridView.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView_ColumnHeaderMouseClick);
    9697      this.dataGridView.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.dataGridView_CellValueNeeded);
    9798      this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
  • trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs

    r3312 r3314  
    2222using System;
    2323using System.ComponentModel;
     24using System.Collections.Generic;
    2425using System.Drawing;
    2526using System.Linq;
     
    3839    }
    3940
     41    private int[] virtualRowIndizes;
     42    private List<KeyValuePair<int, SortOrder>> sortedColumnIndizes;
     43    RowComparer rowComparer;
     44
    4045    public StringConvertibleMatrixView() {
    4146      InitializeComponent();
     
    4550      errorProvider.SetIconAlignment(columnsTextBox, ErrorIconAlignment.MiddleLeft);
    4651      errorProvider.SetIconPadding(columnsTextBox, 2);
     52      sortedColumnIndizes = new List<KeyValuePair<int, SortOrder>>();
     53      rowComparer = new RowComparer();
    4754    }
    4855    public StringConvertibleMatrixView(IStringConvertibleMatrix content)
     
    6673    protected override void OnContentChanged() {
    6774      base.OnContentChanged();
     75      sortedColumnIndizes.Clear();
     76      virtualRowIndizes = new int[0];
    6877      if (Content == null) {
    6978        Caption = "StringConvertibleMatrix View";
     
    8998      dataGridView.ColumnCount = 0;
    9099      if ((Content.Rows > 0) && (Content.Columns > 0)) {
     100        virtualRowIndizes = Enumerable.Range(0, Content.Rows - 1).ToArray();
    91101        dataGridView.RowCount = Content.Rows;
    92102        dataGridView.ColumnCount = Content.Columns;
     
    111121        if (Content.RowNames.Count() != 0)
    112122          dataGridView.Rows[i].HeaderCell.Value = Content.RowNames.ElementAt(i);
    113         else 
     123        else
    114124          dataGridView.Rows[i].HeaderCell.Value = i.ToString();
    115125      }
     
    121131        Invoke(new EventHandler<EventArgs<int, int>>(Content_ItemChanged), sender, e);
    122132      else {
    123         dataGridView.Rows[e.Value].Cells[e.Value2].Value = Content.GetValue(e.Value, e.Value2);
    124         Size size = dataGridView.Rows[e.Value].Cells[e.Value2].PreferredSize;
    125         dataGridView.Columns[e.Value2].Width = Math.Max(dataGridView.Columns[e.Value2].Width, size.Width);
     133        dataGridView.InvalidateCell(e.Value, e.Value2);
    126134      }
    127135    }
     
    186194    private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) {
    187195      string value = e.Value.ToString();
    188       e.ParsingApplied = Content.SetValue(value, e.RowIndex, e.ColumnIndex);
    189       if (e.ParsingApplied) e.Value = Content.GetValue(e.RowIndex, e.ColumnIndex);
     196      int rowIndex = virtualRowIndizes[e.RowIndex];
     197      e.ParsingApplied = Content.SetValue(value, rowIndex, e.ColumnIndex);
     198      if (e.ParsingApplied) e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
    190199    }
    191200    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
     
    193202    }
    194203    private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
    195       e.Value = Content.GetValue(e.RowIndex, e.ColumnIndex);
     204      if (e.RowIndex < virtualRowIndizes.Length) {
     205        int rowIndex = virtualRowIndizes[e.RowIndex];
     206        e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
     207      }
    196208    }
    197209
     
    203215      UpdateRowHeaders();
    204216    }
     217
     218    private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
     219      //if (Content != null && Content.SortableView) {
     220      if (e.Button == MouseButtons.Left) {
     221        bool addToSortedIndizes = (Control.ModifierKeys & Keys.Control) == Keys.Control;
     222        SortOrder newSortOrder = SortOrder.Ascending;
     223        if (sortedColumnIndizes.Any(x => x.Key == e.ColumnIndex)) {
     224          SortOrder oldSortOrder = sortedColumnIndizes.Where(x => x.Key == e.ColumnIndex).First().Value;
     225          int enumLength = Enum.GetValues(typeof(SortOrder)).Length;
     226          newSortOrder = oldSortOrder = (SortOrder)Enum.Parse(typeof(SortOrder), ((((int)oldSortOrder) + 1) % enumLength).ToString());
     227        }
     228
     229        if (!addToSortedIndizes)
     230          sortedColumnIndizes.Clear();
     231
     232        if (sortedColumnIndizes.Any(x => x.Key == e.ColumnIndex)) {
     233          int sortedIndex = sortedColumnIndizes.FindIndex(x => x.Key == e.ColumnIndex);
     234          if (newSortOrder != SortOrder.None)
     235            sortedColumnIndizes[sortedIndex] = new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder);
     236          else
     237            sortedColumnIndizes.RemoveAt(sortedIndex);
     238        } else
     239          if (newSortOrder != SortOrder.None)
     240            sortedColumnIndizes.Add(new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder));
     241        Sort();
     242      }
     243      //}
     244    }
     245
     246    private void Sort() {
     247      int[] newSortedIndex = Enumerable.Range(0, Content.Rows - 1).ToArray();
     248      if (sortedColumnIndizes.Count != 0) {
     249        rowComparer.sortedIndizes = sortedColumnIndizes;
     250        rowComparer.matrix = Content;
     251        Array.Sort(newSortedIndex, rowComparer);
     252      }
     253      virtualRowIndizes = newSortedIndex;
     254      dataGridView.Invalidate();
     255      foreach (DataGridViewColumn col in this.dataGridView.Columns)
     256        col.HeaderCell.SortGlyphDirection = SortOrder.None;
     257      foreach (KeyValuePair<int, SortOrder> p in sortedColumnIndizes)
     258        this.dataGridView.Columns[p.Key].HeaderCell.SortGlyphDirection = p.Value;
     259    }
    205260    #endregion
    206261
    207 
     262    private class RowComparer : IComparer<int> {
     263      public List<KeyValuePair<int, SortOrder>> sortedIndizes;
     264      public IStringConvertibleMatrix matrix;
     265      public RowComparer() {
     266      }
     267
     268      public int Compare(int x, int y) {
     269        int result = 0;
     270        double double1, double2;
     271        DateTime dateTime1, dateTime2;
     272        string string1, string2;
     273
     274        foreach (KeyValuePair<int, SortOrder> pair in sortedIndizes) {
     275          string1 = matrix.GetValue(x, pair.Key);
     276          string2 = matrix.GetValue(y, pair.Key);
     277          if (double.TryParse(string1, out double1) && double.TryParse(string2, out double2))
     278            result = double1.CompareTo(double2);
     279          else if (DateTime.TryParse(string1, out dateTime1) && DateTime.TryParse(string2, out dateTime2))
     280            result = dateTime1.CompareTo(dateTime2);
     281          else {
     282            if (string1 != null)
     283              result = string1.CompareTo(string2);
     284            else if (string2 != null)
     285              result = string2.CompareTo(string1) * -1;
     286          }
     287          if (pair.Value == SortOrder.Descending)
     288            result *= -1;
     289          if (result != 0)
     290            return result;
     291        }
     292        return result;
     293      }
     294    }
    208295  }
    209296}
Note: See TracChangeset for help on using the changeset viewer.