Diskuze: dataGridView - pomalé načítání a řazení
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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 ?
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ě.
Bez kodu tezko rict, ale co tak delat select po mene radcich?
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.
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)....
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í.
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
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
Jak už jsem psal obarvení trvá cca 1 vteřinu.
Problém je délka provedení řádku datagridview.DataSource = 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.
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;
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.AutoSizeRowsMode =
DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;
Zobrazeno 12 zpráv z 12.