Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[c#] SortCompare DataGridView met DBNull.Value waarden

Pagina: 1
Acties:

Verwijderd

Topicstarter
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.

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.

Verwijderd

Topicstarter
Heel topic gemaakt, zie ik dat er een fout in de code zit op regel 2. Dit moet == zijn in plaats van !=. Dat lost al een hoop op, wat echter nog niet goed werkt is dat als ik descending sort, de DBNull.Value waarden niet onder 'echte' waarden worden gesorteerd. Iets van:

Ascending: DBNull.Value, DBNull.Value, 1, 2, 3.
Descending: DBNull.Value, DBNull.Value, 3, 2, 1.

Descending moet echter zijn: 3, 2, 1, DBNull.Value, DBNull.Value.

Verwijderd

Topicstarter
Ik ben er nog niet achter, maar ik vind een sort van 0, 1, -1 toch duidelijker: waarden altijd bovenaan en dan ascending of descending gesort.

Bedankt voor alle input ;) :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:22
Verwijderd schreef op donderdag 10 juli 2008 @ 17:21:
Heel topic gemaakt, zie ik dat er een fout in de code zit op regel 2. Dit moet == zijn in plaats van !=.
Altijd je code eens zelf debuggen he ..
Dat lost al een hoop op, wat echter nog niet goed werkt is dat als ik descending sort, de DBNull.Value waarden niet onder 'echte' waarden worden gesorteerd. Iets van:

Ascending: DBNull.Value, DBNull.Value, 1, 2, 3.
Descending: DBNull.Value, DBNull.Value, 3, 2, 1.

Descending moet echter zijn: 3, 2, 1, DBNull.Value, DBNull.Value.
Als je een DBNull.Value ziet, Int32.MinValue returnen ?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

Waarom maak je geen eigen class die IComparer implementeert en gebruik je deze om te sorteren?

Digitaal onderwijsmateriaal, leermateriaal voor hbo