Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-09-2013, 21:58   #1
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 07:59   #2
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da rizzotti91 Guarda i messaggi
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
Beh, la soluzione l'hai citata pure tu. Genera la DataTable tramite una query in background (E magari nel mentre che esegui la query visualizzi una barra di caricamento continua), quindi al termine di essa imposti la DataSource della tabella con il DataTable appena generato.

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 08:02.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 11:33   #3
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Beh, la soluzione l'hai citata pure tu. Genera la DataTable tramite una query in background (E magari nel mentre che esegui la query visualizzi una barra di caricamento continua), quindi al termine di essa imposti la DataSource della tabella con il DataTable appena generato.

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).
Ciao, ti ringrazio per la risposta.
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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 12:00   #4
totti240282
Senior Member
 
L'Avatar di totti240282
 
Iscritto dal: Feb 2002
Messaggi: 309
Anche se il vero Thread si fa senza quegli operatori, operazioni asincrone sono differenti da operazioni su altri Thread.
totti240282 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 12:50   #5
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da totti240282 Guarda i messaggi
Anche se il vero Thread si fa senza quegli operatori, operazioni asincrone sono differenti da operazioni su altri Thread.
Ni.

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 13:00.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 16:00   #6
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 17:07   #7
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
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:
dataGrid.dataSource = CaricaDT(query, datatable);
Il metodo è così:
Quote:
Thread thread = new Thread(() => SvolgiDT(query, dt));
thread.Start();
while (thread.IsAlive)
{

}
return dt;
Quote:
dt.Clear();
try
{
Connection.Apri();
MySqlDataAdapter da = new MySqlDataAdapter(query, Connection.cnMySql);
da.Fill(dt);
Connection.Chiudi();
return dt;
}
catch (MySqlException)
{
MessageBox.Show("Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Il problema è che non ci ho concluso nulla così... la GUI si blocca quando carico la datagrid..
__________________
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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2013, 19:05   #8
Storti
Junior Member
 
Iscritto dal: Sep 2013
Messaggi: 24
Quote:
Originariamente inviato da rizzotti91 Guarda i messaggi
L'utilizzo della modalità virtuale della datagridview potrebbe essere una soluzione?
Per velocizzare la visualizzazione dei dati sì. Per il caricamento dal DB ovviamente no.
Storti è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2013, 07:17   #9
Riordian
Senior Member
 
L'Avatar di Riordian
 
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ì Comunqe il threading rimana una soluzione valida ovviamente.
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
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2013, 07:24   #10
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Quote:
Originariamente inviato da Riordian Guarda i messaggi
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ì Comunqe il threading rimana una soluzione valida ovviamente.
Oltretutto anche per l'utente che visualizza i dati sarebbe meglio, poi dipende dalle esigenze della tua applicazione.
altra soluzione potrebbe essere il caricamento durante lo scrolling dei dati successivi, un po' come succede nei social network.
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2013, 11:29   #11
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
Iscritto dal: May 2005
Città: Messina
Messaggi: 15654
Quote:
Originariamente inviato da Riordian Guarda i messaggi
altra soluzione potrebbe essere il caricamento durante lo scrolling dei dati successivi, un po' come succede nei social network.
Infatti é proprio questo che vorrei fare... E da quello che ho capito, la virtual mode serve proprio a questo. Inoltre vorrei che il caricamento avvenga comunque in un Thread separato, in modo da non bloccare mai la GUI. Qualcuno mi sa indicare come fare?

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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2013, 13:05   #12
Riordian
Senior Member
 
L'Avatar di Riordian
 
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
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2013, 22:58   #13
marco.r
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2013, 18:52   #14
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Quote:
Originariamente inviato da marco.r Guarda i messaggi
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.
Quoto tutto.. in effetti per una griglia la cosa migliore è la paginazione..
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2013, 21:14   #15
rizzotti91
Senior Member
 
L'Avatar di rizzotti91
 
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
rizzotti91 è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2013, 22:48   #16
marco.r
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
Insomma non fai altro che mostrare un sottoset limitato di tutta la tabella
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2013, 09:03   #17
Riordian
Senior Member
 
L'Avatar di Riordian
 
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 http://www.codeproject.com/Articles/...iew-in-WinForm
__________________
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 09:11.
Riordian è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
Hai una PSP nel cassetto? Questo nuovo p...
Oracle presenta Java 27 con diverse novi...
Il microscopio dell'EPFL vede più...
Volvo avvia la produzione dei nuovi cami...
26 offerte Amazon da non perdere, da iPh...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:38.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v