Esempio di utilizzo VirtualMode con DataGridView

giovedì 05 maggio 2011 - 22.31
Tag Elenco Tags  VB.NET  |  .NET 4.0

luka82 Profilo | Junior Member

Devo prelevare i dati dal Database e, visto che sono numerosi, ho letto che è possibile utilizzare la proprietà VirtualMode del DataGridView. Mi sapreste indicare un esempio funzionante di come utilizzare tale proprietà con l'uso del Database?
Ciao

jackk87 Profilo | Junior Member

Ciao quanti sono i record da caricare?perchè io ne carico circa 10000 e non ho problemi..cmq se vuoi un'esempio di virtual mode puoi dare uno sguardo qui http://sander.myblog.it/archive/2008/11/08/datagridview-il-caricamento-progressivo-dei-dati.html

luka82 Profilo | Junior Member

Ho provato a caricare l'elenco dei comuni d'Italia sia da Access che SQL Server e, il tempo per caricarli non è accettabile, nel caso di SQL Server i tempi sono minori ma altrettanto non accettabili.
Do' un occhio al link che mi hai inviato e ti faccio sapere.
Ciao e grazie

jackk87 Profilo | Junior Member

>Ho provato a caricare l'elenco dei comuni d'Italia sia da Access
>che SQL Server e, il tempo per caricarli non è accettabile, nel
>caso di SQL Server i tempi sono minori ma altrettanto non accettabili.
>Do' un occhio al link che mi hai inviato e ti faccio sapere.
>Ciao e grazie
ciao ho creato anche io un'applicazione che mi legge tutti i comuni d'italia non voglio esagerare ma non ci metto neanche 1 secondo a popolare la datagridview con tutti i comuni (circa 10000) perchè non posti il codice che usi per popolare la datagridview?

luka82 Profilo | Junior Member

Il codice che uso per prelevare dal DB SqlServer e inserire i dati nel DG è il seguente:
Dim Conn As New SqlClient.SqlConnection(xPref.StringaConnessione)
Dim DataReader As SqlClient.SqlDataReader = Nothing
Dim Cmd As SqlClient.SqlCommand
Conn.Open()

Try
Cmd = New SqlClient.SqlCommand
Cmd.CommandText = "SELECT * FROM COMUNI ORDER BY nome"
Cmd.Connection = Conn
DataReader = Cmd.ExecuteReader
DG1.Rows.Clear()

While DataReader.Read()
DG1.Rows.Add()
DG1.Rows(DG1.RowCount - 1).Cells("id").Value = DataReader("IDCOM")
DG1.Rows(DG1.RowCount - 1).Cells("città").Value = DataReader("nome")
DG1.Rows(DG1.RowCount - 1).Cells("prov").Value = DataReader("prov")
DG1.Rows(DG1.RowCount - 1).Cells("cap").Value = DataReader("cap")
DG1.Rows(DG1.RowCount - 1).Cells("prefisso").Value = DataReader("prefisso")
DG1.Rows(DG1.RowCount - 1).Cells("codcomune").Value = DataReader("CODCOM")
DG1.Rows(DG1.RowCount - 1).Cells("codistat").Value = DataReader("CODISTAT") DG1.Rows(DG1.RowCount - 1).Cells("regione").Value = DataReader("REGIONE")
(DG1.RowCount - 1).ReadOnly = True
End While
Catch
MsgBox("Si è verificato un errore durante la creazione dell'elenco delle città." & vbNewLine & Err.Description, MsgBoxStyle.Critical, "Errore: " & Err.Number)
Finally
Conn.Close()
Cmd = Nothing
DataReader.Close()
Conn = Nothing
DataReader = Nothing
End Try

poi ho provato a caricarli prima in un Array (in un thread separato all'avvio dell'applicazione) e quando mi serve li visualizzo ottenendo un incremento delle prestazioni che rimangono comunque inaccettabili(parliamo di 7-8 secondi)
Try
DG1.Rows.Clear()

For i As Integer = 0 To UBound(Comuni) - 1
DG1.Rows.Add()
DG1.Rows(DG1.RowCount - 1).Cells("id").Value = Comuni(i).IDComune
DG1.Rows(DG1.RowCount - 1).Cells("città").Value = Comuni(i).Comune
DG1.Rows(DG1.RowCount - 1).Cells("prov").Value = Comuni(i).Prov
DG1.Rows(DG1.RowCount - 1).Cells("cap").Value = Comuni(i).CAP
DG1.Rows(DG1.RowCount - 1).Cells("prefisso").Value = Comuni(i).Prefisso
DG1.Rows(DG1.RowCount - 1).Cells("codcomune").Value = Comuni(i).CodiceComune
DG1.Rows(DG1.RowCount - 1).Cells("codistat").Value = Comuni(i).CodiceISTAT
DG1.Rows(DG1.RowCount - 1).Cells("regione").Value = Comuni(i).Regione
DG1.Rows(DG1.RowCount - 1).ReadOnly = True
If PB IsNot Nothing Then PB.SetProgressBarValue(PB.ProgressBar1, (PBCnt / MaxCnt) * 100)
PBCnt += 1
Next i
Catch
MsgBox("Si è verificato un errore durante la creazione dell'elenco delle città." & vbNewLine & Err.Description, MsgBoxStyle.Critical, "Errore: " & Err.Number)
End Try

Attendo notizie, grazie

jackk87 Profilo | Junior Member

Il codice che utilizzi è giusto per inserire una colonna alla volta ma non va bene nel tuo caso, instanto ti do un consiglio se nella query non utilizzi il carattere * ma solo i campi che ti interessando come in questo caso penso che ti interessino solo cap comune e provincia in modo che non appesantisci la query. Tornando a noi prova il codice che ti posto di seguito popolando la datagridview con i dataset in un colpo solo:
nella dichiarazione del form inserisci:
Dim BS As New BindingSource 'Binding Source Dim DS As New DataSet 'Data Set

mentre in una procedura su un click di un button dove vuoi, inserisci questo codice che serve per popolare la DGW
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

in questo codice c'è il BindingSource per applicare un filtro ai dati eccetera senza rileggere dal DB ma effettuarlo sul dataset se non ti interessa il binding source elimini la parte di codice che interessa lui e cambi questa stringa così:
dgwComuni.DataSource = DS.Table(0)

spero di esserti stato utile e fammi sapere

luka82 Profilo | Junior Member

Ottimo!!!
Solo che il metodo postato mi dava la DG vuota(mi caricava solo le righe, ma vuote), ho trovato poi in rete un codice simile che mi ha caricato tutti i comuni in poco meno di un secondo(ottimo risultato direi):
Dim sql As String = "SELECT * FROM COMUNI" Dim Conn As New SqlConnection(xPref.StringaConnessione) Dim DataAdapter As New SqlDataAdapter(sql, Conn) Dim ds As New DataSet() Conn.Open() DataAdapter.Fill(ds, "COMUNI") Conn.Close() DG1.DataSource = ds DG1.DataMember = "COMUNI"

Non è tanto la questione dell'asterisco nella query che appesantisce(che peraltro è necessario visto che mi servono tutti i campi), ma era proprio il metodo di caricamento.
Vorrei approfondire l'utilizzo di DataSet & C. hai qualche link che mi possa essere utile?
Ho letto che è possibile comunque effettuare tutte le operazione che normalmente io effettuo manualmente(INSERT, UPDATE, SELECT, ecc.), giusto?

Ciao e grazie

jackk87 Profilo | Junior Member

non so dove puoi approfondire cmq prova a vedere qui http://totemslair.org/guide/vb.php è una guida abbastanza completa e fatta bene. Tornando al dataset e dataadapter potresti anche effettuare insert,update e delete in un colpo solo nel db
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5