Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Sortování dataGridView

C# .NET .NET (C# a Visual Basic) Sortování dataGridView American English version English version

Aktivity (1)
Avatar
tester
Člen
Avatar
tester:10.11.2015 13:19

Ahoj,
potřeboval bych poradit jak srovnat(pomocí kliknutí na název sloupce) dataGridView pomocí datumu.

Ve sloupcích mám datum ve formátu "dd.MM.yyyy HH:mm:ss". Když ale datumy setřídím, dostanu pořadí s přeházenými dny podle první číslice.

Příklad: Řádky s datumem od 30.10 do 6.11

1.11.2015
2.11.2015
3.11.2015
4.11.2015
5.11.2015
6.11.2015
30.11.2015
31.11.2015

Díky za radu.

 
Odpovědět 10.11.2015 13:19
Avatar
Honza
Člen
Avatar
Honza:10.11.2015 13:48

Ahoj, podle toho co píšeš to vypadá že datum není v datagridview vloženo jako datum, ale jako text. Je potřeba aby daný sloupeček měl jako datový typ Date a ne String, pak by ti to mělo sortování fungovat podle očekávání.

Nahoru Odpovědět  +1 10.11.2015 13:48
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
tester
Člen
Avatar
tester:10.11.2015 14:01

I to jsem zkoušel pomocí:

dataGridView1.Columns[0].ValueType = typeof(DateTime);

Ale ani to nepomohlo. Nastavil jsem i styl toho sloupce na formát datumu a taky nic.

Editováno 10.11.2015 14:02
 
Nahoru Odpovědět 10.11.2015 14:01
Avatar
Honza
Člen
Avatar
Honza:10.11.2015 14:10

Styl nehraje roli, jde o datový typ. Hoď sem kód jak vytváříš tabulku a jak ji plníš daty, pes bude zakopaný nejspíš tam. Datový typ sloupce je potřeba nastavit předtím než daný sloupec vložíš do datagridview, pak to myslím už změnit nejde.

Nahoru Odpovědět  +1 10.11.2015 14:10
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
tester
Člen
Avatar
tester:10.11.2015 14:16

Celý kód sem dávat nebudu, je to moc dlouhý, ale tady je vkládání dat:

dataGridView1.Rows.Add(Data[i][0], Data[i][1], Data[i][2]);

Celý list Data je string. Do listu ukládám datum jako

Data[i][0] = datum.ToString();
 
Nahoru Odpovědět 10.11.2015 14:16
Avatar
Odpovídá na tester
Libor Šimo (libcosenior):10.11.2015 14:18

A v .ToString() je pes zakopaný. ;-)

Nahoru Odpovědět 10.11.2015 14:18
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
tester
Člen
Avatar
tester:10.11.2015 14:20

Takže mám vkládat proměnnou typu DateTime do tabulky?

 
Nahoru Odpovědět 10.11.2015 14:20
Avatar
Odpovídá na tester
Michal Štěpánek:10.11.2015 14:23

Ano. Nemůžeš po programu chtít, aby ti data třídil podle datumů, když je tam máš jako text...

Editováno 10.11.2015 14:24
Nahoru Odpovědět 10.11.2015 14:23
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
tester
Člen
Avatar
tester:10.11.2015 14:40

Ano už to funguje. Myslel jsem že to program za filtruje podle toho, jaký sem nastavil typ. Díky moc.

 
Nahoru Odpovědět 10.11.2015 14:40
Avatar
tester
Člen
Avatar
tester:10.11.2015 14:43

Teď jsem ale přišel na to, že pokud vložím prázdné pole do tohoto sloupce Datetime a data setřídím, program spadne. Dá se nějak nastavit, aby se třídily jen vyplněná pole a prázdná to nebralo?

 
Nahoru Odpovědět 10.11.2015 14:43
Avatar
Odpovídá na tester
Michael Škrášek:10.11.2015 14:47

Tak tam dej podmínku, aby se nedala přidat prázdná pole.

Nahoru Odpovědět 10.11.2015 14:47
I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it ... Bill Gates
Avatar
tester
Člen
Avatar
tester:10.11.2015 15:03

Jasně takhle to jde určitě. Ale kdyby tam ty data mohly být nulový, jde to nějak ošetřit?

 
Nahoru Odpovědět 10.11.2015 15:03
Avatar
tester
Člen
Avatar
tester:10.11.2015 15:09

Tak sem to vyřešil takto:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {
            DateTime d1 = string.IsNullOrEmpty(e.CellValue1.ToString()) == false ? Convert.ToDateTime(e.CellValue1) : new DateTime();
            DateTime d2 = string.IsNullOrEmpty(e.CellValue2.ToString()) == false ? Convert.ToDateTime(e.CellValue2) : new DateTime();
            e.SortResult = DateTime.Compare(d1, d2);
            e.Handled = true;
        }
 
Nahoru Odpovědět  +1 10.11.2015 15:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.