In mijn project heb ik een DataGridView waarbij de data via een object array is toegevoegd. Bijvoorbeeld zoals hieronder is geillustreerd (alleen gebruik ik dan datatable.rows[i].ItemArray). Als ik echter de derde column probeer te sorteren crasht de applicatie met een exception.
De applicatie crashed op Application.Run(new FormMain()) in de Program.cs klasse met een van onderstaande messages.
ArgumentException was unhandled --> Object must be of type Decimal.
ArgumentException was unhandled --> At least one object must implement IComparable.
De applicatie crashed dus omdat de comparer niet weet hoe het de DBNull.Value moet sorteren. Hierop heb ik een sort compare eventhandler toegevoegd met de volgende code (een beetje als: \[c#] DataGridView Sort method override).
Bij het sorten crashed de applicatie niet meer, maar de sort resultaten zijn nog niet goed. Het doel is om de DBNull.Value objecten te sorteren aan het begin of het einde (afhankelijk van Ascending of Descending). Ik weet alleen niet wat het probleem is, aangezien de code volgens mij klopt.
Je kan bovenstaande code zelf uitvoeren door een DataGridView met drie colommen aan je form toe te voegen.
De applicatie crashed op Application.Run(new FormMain()) in de Program.cs klasse met een van onderstaande messages.
ArgumentException was unhandled --> Object must be of type Decimal.
ArgumentException was unhandled --> At least one object must implement IComparable.
C#:
1
2
3
4
5
6
7
8
9
10
11
| for ( int i = 0; i < 4; i++ ) { object[] abca = new object[] {"abc", "abc", "abc"}; dataGridView1.Rows.Add(abca); } for ( int i = 0; i < 4; i++ ) { object[] abca = new object[] { "abc", "abc", DBNull.Value}; dataGridView1.Rows.Add(abca); } |
De applicatie crashed dus omdat de comparer niet weet hoe het de DBNull.Value moet sorteren. Hierop heb ik een sort compare eventhandler toegevoegd met de volgende code (een beetje als: \[c#] DataGridView Sort method override).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| DataGridView grid = (DataGridView)sender; if ( e.CellValue1 == DBNull.Value && e.CellValue2 != DBNull.Value ) { e.SortResult = 0; e.Handled = true; } else if ( e.CellValue1 == DBNull.Value ) { e.SortResult = -1; e.Handled = true; } else if ( e.CellValue2 == DBNull.Value ) { e.SortResult = 1; e.Handled = true; } if ( e.Handled && grid.SortOrder == System.Windows.Forms.SortOrder.Descending ) e.SortResult = -e.SortResult; |
Bij het sorten crashed de applicatie niet meer, maar de sort resultaten zijn nog niet goed. Het doel is om de DBNull.Value objecten te sorteren aan het begin of het einde (afhankelijk van Ascending of Descending). Ik weet alleen niet wat het probleem is, aangezien de code volgens mij klopt.
Je kan bovenstaande code zelf uitvoeren door een DataGridView met drie colommen aan je form toe te voegen.