|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
[C#] Popolamento progressivo datagridview
Ciao, ho necessità di popolare diverse dataGridView con migliaia e migliaia di record a partire da un database.
Al momento adotto un sistema che non tanto mi piace... prelevo i dati dal db, li metto in una datatable e successivamente li faccio visualizzare. Sul pc in firma anche se ci sono oltre 20.000 righe il caricamento è istantaneo, ma basta andare a provare il software su un pc più "normale" ed un piccolo impuntamento iniziale si percepisce. Altra nota dolente della mia soluzione è che non riempio la datatable in un thread in background, ciò comporta avere l'interfaccia del tutto bloccata fin quando non è andato il buon fine il prelievo dei dati. Altro grossissimo problema è quando utilizzo un server mysql via internet per popolare il tutto, dove i tempi di attesa si prolungano per almeno 12-15 secondi durante i quali non si può fare nulla... Avete qualche soluzione da proporre? Grazie
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
L'infrastruttura per i Thread in C# è una goduria, e l'introduzione degli operatori await e async ha reso il tutto di una banalità unica (anche se è sempre meglio darsi una bella letta alla gestione delle operazioni asincrone prima dell'introduzione di questi operatori, per capire davvero come funziona il tutto). Ultima modifica di [Kendall] : 30-09-2013 alle 09:02. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Quote:
Così facendo però avrò la datagrid popolata solo alla fine del prelievo dati, mi sarebbe piaciuto un qualcosa di progressivo.. Inviato dal mio GT-N7100 con Tapatalk 4
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 304
|
Anche se il vero Thread si fa senza quegli operatori, operazioni asincrone sono differenti da operazioni su altri Thread.
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Non ho detto che gli operatori async e await SONO il multithreading, ma che l'introduzione degli stessi ha reso la gestione di più thread ancor più banale rispetto alla già semplificata struttura creata tramite i Task. Il discorso poi è molto vasto e per nulla banale. Asincronia, Synchronization Context, generazione nuovi thread... Sono tutti argomenti che entrano in gioco, e appunto e tutto fuorchè banale. Ultima modifica di [Kendall] : 30-09-2013 alle 14:00. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
L'utilizzo della modalità virtuale della datagridview potrebbe essere una soluzione?
Come faccio a popolare una dataGridView in virtual mode a partire da un DB?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
|
|
|
|
#7 | |||
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Intanto sto facendo delle prove per far si che il thread per il caricamento della dataTable venga eseguito in background però, sinceramente, non so come muovermi...
Al momento, nel form con la dataGrid, ho il richiamo ad un metodo da me creato: Quote:
Quote:
Quote:
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|||
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Sep 2013
Messaggi: 24
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Se hai migliaia di record secondo me converrebbe comunque fare una paginazione della datagrid view... così facendo prelevi decisamente meno record da db diminuendo i tempi per visualizzare la pagina... io farei così
Oltretutto anche per l'utente che visualizza i dati sarebbe meglio, poi dipende dalle esigenze della tua applicazione.
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Quote:
Inviato dal mio GT-N7100 con Tapatalk 4
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
sono un po' a digiuno di windows form mi spiace, l'unica cosa che ti suggeisco è, se hai cos' tanti dati da prelevare da DB, di evitare di farlo con un unico accesso. Indipendentemente dal'utilizzo del thread o meno
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Consiglio anche io la paginazione.
Oggi sono 20.000 record, e se fra un anno sono 200.000 ? Lasci che il thread scarichi per 5 minuti intasando il DB ? Aggiungo pure che - piu' record sono piu' memoria occupano, e quindi il programma comunque rallentera'. - se l'utente inoltre decide di riordinare l'elenco a meta' scaricamento l'effetto non e' piacevole - una scrollbar per scorrere 20k e passa record e' praticamente inutile, a meno di non dotare tutti di monitor 80" in verticale. Il riempimento progressivo mentre si scrolla non mi piace, non si capisce mai bene quanti dati ci sono e come navigarli. Va bene per i social network perche' comunque si tratta sempre e solo di dati ordinati temporalmente di cui ti importano solo gli eventi piu' recenti. Nessuno si mette a scrollare la pagina di facebook per pescare un post di due mesi fa... La soluzione paginata non sara' molto "kool" ma secondo me la piu' efficace.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
|
Ok, è la cosa migliore, ma come si realizza?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Stai usando windows forms ? (Non mi sembra che datagridview faccia parte di wpf, o no?)
Con C# per le gui ho usato solo silverlight per cui non ti posso dare un aiuto diretto con datagridview cmq l'idea di base e' questa: una volta deciso il numero di record (N) da visualizzare alla volta, per visualizzare la pagina P devi prendere i record da (P-1)*N a P*N Cpm SQL SERVER e' qualcosa tipo Codice:
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY ??? ) AS RowNum, *
FROM MyTable
WHERE SOME_CONDITION
) AS Result
WHERE RowNum >= START_RECORD -- (P-1)*N
AND RowNum < END_RECORD -- P*N
Avrai bisogno di qualche pulsante per gestire la navigazione (pagina successiva pagina precedente) che non fa altro che impostare il nuovo numero di pagina e aggiornare di nuovo il contenuto della datagrid in base al nuovo intervallo. Lavoro un po' noioso ma non difficile. Forse c'e' qualcosa di gia' pronto per le windows forms, non so, cmq se cerchi datagridview pagination so google trovi diversi esempi gia' pronti.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Prova a vedere, come diceva anche marco, se il controllo offre qualcosa di già pronto. Ai tempi un controllo simile che ho usato con asp.net, lo aveva, si settava qualche proprietà del controllo e avevi tutto praticamente gratis. Dubito che non l'abbiano fatto anche per windows form o l'abbiano levato.
In caso contrario ho trovato questo esempio... vedi se ti è utile
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db Ultima modifica di Riordian : 03-10-2013 alle 10:11. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:32.




















