- Timestamp:
- 04/12/10 18:12:55 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
r3312 r3314 22 22 using System; 23 23 using System.ComponentModel; 24 using System.Collections.Generic; 24 25 using System.Drawing; 25 26 using System.Linq; … … 38 39 } 39 40 41 private int[] virtualRowIndizes; 42 private List<KeyValuePair<int, SortOrder>> sortedColumnIndizes; 43 RowComparer rowComparer; 44 40 45 public StringConvertibleMatrixView() { 41 46 InitializeComponent(); … … 45 50 errorProvider.SetIconAlignment(columnsTextBox, ErrorIconAlignment.MiddleLeft); 46 51 errorProvider.SetIconPadding(columnsTextBox, 2); 52 sortedColumnIndizes = new List<KeyValuePair<int, SortOrder>>(); 53 rowComparer = new RowComparer(); 47 54 } 48 55 public StringConvertibleMatrixView(IStringConvertibleMatrix content) … … 66 73 protected override void OnContentChanged() { 67 74 base.OnContentChanged(); 75 sortedColumnIndizes.Clear(); 76 virtualRowIndizes = new int[0]; 68 77 if (Content == null) { 69 78 Caption = "StringConvertibleMatrix View"; … … 89 98 dataGridView.ColumnCount = 0; 90 99 if ((Content.Rows > 0) && (Content.Columns > 0)) { 100 virtualRowIndizes = Enumerable.Range(0, Content.Rows - 1).ToArray(); 91 101 dataGridView.RowCount = Content.Rows; 92 102 dataGridView.ColumnCount = Content.Columns; … … 111 121 if (Content.RowNames.Count() != 0) 112 122 dataGridView.Rows[i].HeaderCell.Value = Content.RowNames.ElementAt(i); 113 else 123 else 114 124 dataGridView.Rows[i].HeaderCell.Value = i.ToString(); 115 125 } … … 121 131 Invoke(new EventHandler<EventArgs<int, int>>(Content_ItemChanged), sender, e); 122 132 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); 126 134 } 127 135 } … … 186 194 private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) { 187 195 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); 190 199 } 191 200 private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { … … 193 202 } 194 203 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 } 196 208 } 197 209 … … 203 215 UpdateRowHeaders(); 204 216 } 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 } 205 260 #endregion 206 261 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 } 208 295 } 209 296 }
Note: See TracChangeset
for help on using the changeset viewer.