Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Pflegshörl:20.11.2018 13:42

Načítám do dataGridView DataTable (cca 1500 řádků a 34 sloupců)
Prvním načtení dataGridView_Con­tent.DataSource = Tabulka; trvá cca 1 vteřinu
První seřazení dataGridView_Con­tent.Sort(data­GridView_Conten­t.Columns["Da­te_start"], ListSortDirec­tion.Ascendin­g); trvá cca 1 vteřinu

Každé další znovu vyvolané načtení dataGridView_Con­tent.DataSource = Tabulka; trvá cca 3 vteřiny
Každé další znovu vyvolané seřazení dataGridView_Con­tent.Sort(data­GridView_Conten­t.Columns["Da­te_start"], ListSortDirec­tion.Ascendin­g); trvá cca 5 vteřin

Zkusil jsem: Zapnout VirtualMode

Chci docílit: Aby načtení a seřazení bylo stejně rychlé jako poprvé?

 
Odpovědět
20.11.2018 13:42
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:2.12.2018 23:51

Ahoj, asi by to chtělo zdroják, je to divné. Nemůže to ovlivňovat nějaký proces bokem ? Co se tam vše děje ? Nemůže to zpomalovat nějaký datagridviewcolumn vlastní výroby ? Co použít debugger a projít všechen vlastní zdroják, který se tam při DataSource = provádí ? (Pravá myš, step into) Není problém např. ve vykreslování ? Jak se to chová, když nad gridem přejedeš jiným oknem ? Stíhá to včas vykreslovat buňky ?

 
Nahoru Odpovědět
2.12.2018 23:51
Avatar
Michal Pflegshörl:3.12.2018 14:59

Při DataSource se nic dalšího neprovádí, stejně jako při Sort.
Používám programové obarvení řádků (bílá liché, šedá sudé) to se ale provádí až po DataSource. Problém asi bude v množství dat. Při cca 100 řádcích je to v pohodě.

 
Nahoru Odpovědět
3.12.2018 14:59
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:3.12.2018 15:17

Bez kodu tezko rict, ale co tak delat select po mene radcich?

 
Nahoru Odpovědět
3.12.2018 15:17
Avatar
Michal Pflegshörl:3.12.2018 15:26

To mě napadlo.
Vyzrál jsem na to stránkováním datagridview po 100 řádcích.
Řažení a filtrování dělám na úrovni DataTable, kterou pak nastavuji jako datasource pro datagridview.

 
Nahoru Odpovědět
3.12.2018 15:26
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:3.12.2018 20:17

No, pokud používáš stránkování, měl bys sortovat v db celou table, jinak se to asi bude chovat zvláštně. (Předpokládám, že načítáš jen část tabulky)...

Nehodil bys sem obsluhu eventu na ty liché a sudé řádky ? Nebude problém tam ? Volá se pro každou buňku/řádek, neděje se tam něco pomalého ? (Pokud si dobře pamatuji, windows.forms jsem již delší dobu nepoužíval)....

 
Nahoru Odpovědět
3.12.2018 20:17
Avatar
Michal Pflegshörl:5.12.2018 9:59

Do DataTable načtu data z DB a pak už pracuji jen z DataTable.
Řazení probíhá tak, že V eventu datagridview_Sorted provedu seřazení DataTable, kterou potom nastavím jako DataSource pro datagridview.
Obarvování řádku dělám touto metodou:

public void ObarviRadky(DataGridView Seznam)
{
        Seznam.DefaultCellStyle.ForeColor = Color.Black;
        Seznam.DefaultCellStyle.SelectionBackColor = Color.FromArgb(0, 190, 243);

        Color BarvaLichehoRadku = Seznam.DefaultCellStyle.BackColor;
        Color BarvaSudehoRadku = Color.LightGray;
        Color BarvaRadku = BarvaSudehoRadku;
        Color BarvaPisma = VychoziBarvaPisma;

        foreach (DataGridViewRow Radek in Seznam.Rows)
        {
                if (Radek.Visible == false)
                        continue;

                if (BarvaRadku == BarvaSudehoRadku)
                    BarvaRadku = BarvaLichehoRadku;
                else
                    BarvaRadku = BarvaSudehoRadku;

                Radek.DefaultCellStyle.BackColor = BarvaRadku;
                Radek.DefaultCellStyle.ForeColor = BarvaPisma;
        }

        Seznam.ClearSelection();
}

Provedení obarvení trvá při těch 1500 řádkcíh kolem 1 vteřiny.
Možná že při zobrazení všech 1500 obarvených řádků mu to déle trvá kvůli grafickému vykreslování.
Jak už jsem ale psal, vyřešil jsem to stránkováním po 100 řádcích a pak vše funguje normální rychlostí.

Editováno 5.12.2018 10:01
 
Nahoru Odpovědět
5.12.2018 9:59
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:5.12.2018 20:43

Aha, myslel jsem si, že používáš cell_formatting. Napadlo mě ještě, že každá změna barvy vyvolá nový repaint. (winapi zpráva, což může být to zpomalení)

Jinak si ještě myslím, že není potřeba porovnávat barvy, ale stačilo by % 2

Pokud ti ale vše funguje tak, že jsi s tím spokojený, asi není potřeba dál řešit :)

 
Nahoru Odpovědět
5.12.2018 20:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.12.2018 10:29

Nevic, jak u C, ale v javascriptu ve web prohlizeci 1000 radku neni problem. Serazeni, obarveni, vsechno pod 300ms. A protoze browser a js je postaveny nad C, tak by to melo byt vyrazne pomalejsi.

Na co jsem pri testech narazil, bylo ruzna doba pri ruznem zpusobu sortovani.
Pri prvnim nacteni nacitam data bez filtru. blik, je to tak za 50ms + vykresleni (rekneme 150ms). Ale pokud pouziji filtr, serad treba podle jmena, tak uz tam nasakkuji prave takove casy jako 300ms. A zas hodne casu uberu, kdyz dam filtr zobraz jen 100 radku. Nebo zobraz jen radky, kde ve sloupci slovo zacina treba xyz.
Bohuzel nemuzu dat link. Leda bys mel nekde tva data (nebo jinak, kde je spoustu radku a sloupcu), tak bych to s nima zprovoznil. A navic by ti to asi bylo na nic, kdyz to potrebujes v C :)

 
Nahoru Odpovědět
6.12.2018 10:29
Avatar
Odpovídá na SebelaMichal
Michal Pflegshörl:6.12.2018 14:28

Jak už jsem psal obarvení trvá cca 1 vteřinu.
Problém je délka provedení řádku datagridview.Da­taSource = DataTable, které poprvé trvá 3 vteřiny a po druhé 5 vteřin. žádný další kód tento řádek nevyvolává.

Pomohlo stránkování, takže bych to považoval za vyřízené.
Díky všem za konzultaci.

Editováno 6.12.2018 14:29
 
Nahoru Odpovědět
6.12.2018 14:28
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.12.2018 8:21

Mam html/js demo, kdyby te to zajimalo. Kdyz si tam naimportujes vlastni csv ulozene z excelu s mnoha radky.
https://mlich.zam.slu.cz/…as3-view.htm?…
Neni tam strankovani. Resp, je, ale nepouziva se pro tento kod. Take se tam nepouziva slozeny filtr pres 3 soupce. Tam by prave byla krasne videt rozdilna zatez.
Firefox, 1000 radku pro tu html stranku neni problem (a to je html, pres browser a tak). Ackoliv porovnavani pracuje primo s textem. Mam i jinou verzi, kde si vytvarim indexy.

K tvemu problemu, jeste mne ted napada, neslo by cely ten problemovy objekt vytvorit virtualne a pak jen priradit stejnou promennou? Pripadne vypnout zobrazovani. zpracovat, zapnout. Neco jako u vba wordu a excelu.

x = new datagrid
x.DataSource = ...
datagridview.DataSource = x.DataSource
---
datagridview.show = false;
datagridview.DataSource = ...
datagridview.show = true;
 
Nahoru Odpovědět
7.12.2018 8:21
Avatar
Michal Pflegshörl:15.2.2019 12:36

VYŘEŠENO!
Úplnou náhodou jsem přišel na to, že pomalé načítání a hlavně řazení je způsobeno zapnutou vlastností DataGridView.Au­toSizeRowsMode = DataGridViewAu­toSizeRowsMode­.AllCellsExcep­tHeaders;

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
15.2.2019 12:36
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 12 zpráv z 12.