Caricamento dati in una listview

lunedì 06 marzo 2006 - 13.34

trinity Profilo | Guru

ragazzi,
io di solito carico dei dati da un db su listview in questo modo:

'-----carimento elenco dati
SqlCmd.CommandText = "Select * From Tab_Iva Order By id"
SqlCmd.Connection = Db
SqlCmd.CommandType = CommandType.Text
SqlDr = SqlCmd.ExecuteReader
Dim litem As New ListViewItem
Dim Sublist As ListViewItem.ListViewSubItem
While SqlDr.Read
litem = ListView1.Items.Add(SqlDr.GetSqlInt32(0).Value)
Sublist = litem.SubItems.Add(SqlDr.GetSqlString(1).Value)
Sublist = litem.SubItems.Add(SqlDr.GetSqlString(2).Value)
End While
SqlDr.Close()
SqlCmd.Dispose()

due domande debbo porre:

1 - esiste anche un altro modo (se è anche migliore)

2 - io debbo caricare questi dati all'avvio della form, però ovviamente se inserisco il codice nella Form_Load..il compilatore prima esegue il codice e poi visualizza la form; vorrei che avvenisse il contrario, si può fare e come?

ps il carimento della form avviene tramite il seguente codice:

Dim fmr as New Form1
frm.ShowDialog(Me)


Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Brainkiller Profilo | Guru

>ragazzi,
>io di solito carico dei dati da un db su listview in questo modo:
>due domande debbo porre:
>1 - esiste anche un altro modo (se è anche migliore)

Allora prima cosa, direi che dovresti creare una apposita Stored Procedure su SQL Server per l'estrazione dei dati e non una Query SQL immersa nel codice.
Per il resto un ciclo va bene.

>2 - io debbo caricare questi dati all'avvio della form, però
>ovviamente se inserisco il codice nella Form_Load..il compilatore
>prima esegue il codice e poi visualizza la form; vorrei che avvenisse
>il contrario, si può fare e come?

Se usi .NET 1.1 usa un Thread separato per il riempimento dei controlli. Se usi .NET 2.0 c'è un evento Shown che scatta non appena la Form è visibile, dopo il Load.

Ciao

P.S. Utilizza la funzione "Formatta Codice" del Forum quando posti del codice così è più chiaro e leggibile, e usa la funzione di "Accetta risposta" se risolvi un problema come nel caso di questo Thread:
http://www.dotnethell.it/Forum/messages.aspx?ThreadID=6638

Ciao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

sanbiz Profilo | Senior Member

>ragazzi,
>io di solito carico dei dati da un db su listview in questo modo:
>
> '-----carimento elenco dati
>SqlCmd.CommandText = "Select * From Tab_Iva Order By id"
> SqlCmd.Connection = Db
> SqlCmd.CommandType = CommandType.Text
> SqlDr = SqlCmd.ExecuteReader
> Dim litem As New ListViewItem
> Dim Sublist As ListViewItem.ListViewSubItem
> While SqlDr.Read
>litem = ListView1.Items.Add(SqlDr.GetSqlInt32(0).Value)
>Sublist = litem.SubItems.Add(SqlDr.GetSqlString(1).Value)
>Sublist = litem.SubItems.Add(SqlDr.GetSqlString(2).Value)
> End While
> SqlDr.Close()
> SqlCmd.Dispose()
>
>due domande debbo porre:
>
>1 - esiste anche un altro modo (se è anche migliore)
Se utilizzi il controllo ListView non hai molte soluzioni.
Il controllo listView è molto carino, ma anche abbastanza lento a popolarsi; infatti va bene se hai pochi valori.
Perchè non provi con il controllo dataGridView? In questo caso passeresti un dataset o dataview direttamente al controllo ed avresti il popolamento immediato. E' molto più veloce e ti permette anche di inserirvi immagini, se vuoi. Io lo prenderei in considerazione.

>2 - io debbo caricare questi dati all'avvio della form, però
>ovviamente se inserisco il codice nella Form_Load..il compilatore
>prima esegue il codice e poi visualizza la form; vorrei che avvenisse
>il contrario, si può fare e come?
>
Hai provato a mettere il tuo codice all'interno del controllo activate, ad esempio?

--
Sandro Bizioli

Brainkiller Profilo | Guru

Ciao Trinity,
dimenticavo, prima di popolarlo metti un:

listView1.BeginUpdate();

e alla fine metti un:

listView1.EndUpdatE();

Questo due istruzioni disabilitano e riabilitano il refresh del controllo. Vengono usati quando vengono inseriti molti elementi assieme.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

David mi hai scritto che dovrei creare una apposita Stored Procedure su SQL Server per l'estrazione dei dati e non una Query SQL immersa nel codice.

Sineceramente non l'ho mai fatto, mica potresti farmi un'esempio per capire??e poi dovrei anche crearne una per l'insert,update e delete???

ps dimeticavo il BeginUpdate e EndUpdate va messo prima della While e dopo o all'interno del ciclo

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Brainkiller Profilo | Guru

>David mi hai scritto che dovrei creare una apposita Stored Procedure
>su SQL Server per l'estrazione dei dati e non una Query SQL immersa
>nel codice.

SqlConnection s = new SqlConnection("Server=localhost"); SqlCommand cmd = new SqlCommand("GetOrders", s); cmd.CommandType = CommandType.StoredProcedure; DataSet ds = new DataSet(); SqlDataAdapter da=new SqlDataAdapter(cmd); da.Fill(ds); s.Close();

e sul DB dovrai creare la stored procedure:

CREATE PROCEDURE dbo.GetOrders () AS SELECT * FROM dbo.Orders GO

>ps dimeticavo il BeginUpdate e EndUpdate va messo prima della
>While e dopo o all'interno del ciclo

Fuori dal ciclo.

BeginUpdate()
do while
EndUpdatE()

Ciao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

Ma essendo un gestionale, ci saranno notevoli select anche uguali ma con delle clausole e poi ovviamente delle istruzioni sql Inser,Update,Delete ecc...

Anche per queste mi consigli una stored?

E poi immagiamo che creo una sotred come nel tuo esempio ed in un determinato caso mi server che sia ordinata per id oppure che l'id sia uguale a...quindi utilizzare una where...queste aggiunte come faccio a legarle allo stored..sempre se si posso fare visto che i dati di confronto vengono presi da oggetti text che si trovano sulla Form...

Ps il codice che ho postato prima della listview non mi visualizza i dati eppure su 1.1 ho sempre fatto così e mi funzionava ora su 2.0 sto trovando questo problema..

ho scritto così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ovviamete prima che mi facessi vedere la stored di esempio


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Brainkiller Profilo | Guru

>Ma essendo un gestionale, ci saranno notevoli select anche uguali
>ma con delle clausole e poi ovviamente delle istruzioni sql Inser,Update,Delete
>ecc...

Beh è normale.

>Anche per queste mi consigli una stored?

Direi di sì.

>E poi immagiamo che creo una sotred come nel tuo esempio ed in
>un determinato caso mi server che sia ordinata per id oppure

Utilizzi i parametri.

>Ps il codice che ho postato prima della listview non mi visualizza
>i dati eppure su 1.1 ho sempre fatto così e mi funzionava ora
>su 2.0 sto trovando questo problema..
>Cross-thread operation not valid: Control 'ListView1' accessed
>from a thread other than the thread it was created on.

Per forza tu stai accedendo ad un controllo con un thread che non è lo stesso che ha creato l'oggetto, e questo non si può fare, devi creare codice thread-safe. Utilizzare i threads non è una cosa banale e ci vuole una esperienza rilevante nel campo in questione.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

in altre aprole mi consigli per qualsiasi istruzione sql di creare una stored all'interno di sql server e quali benefici ottengo a differenza del codice che di solito utilizzo, ossia passare query sql all'interno dell'applicativo?

>Utilizzi i parametri.
Come faccio a passare dei parametri alla stored...hai un esempio che posso consultare per vedere ed apprendere???

immaginavo che dovevo creare codice thread-safe...una volta avevo visto su internet un esempio...utile ma non riesco + a trovarlo, cmq su msdn trovo delle infomazioni sul metodo invoke e la delegate....requisiti necessari per creare un thread-safe....


Ciao e grazie mille
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Brainkiller Profilo | Guru

>in altre aprole mi consigli per qualsiasi istruzione sql di creare
>una stored all'interno di sql server e quali benefici ottengo
>a differenza del codice che di solito utilizzo, ossia passare
>query sql all'interno dell'applicativo?

Eh si. I benefici sono numerosi. Qui stai sviluppando una applicazione Windows Forms, ma nel caso di una ASP.NET ci sarebbero grossi problemi di Security e di SQL Injection in questo caso.
Quindi primo punto sicurezza.

Secondo punto manutenzione del software, le modifiche le fai direttamente sul Database non devi modificare il codice sorgente, ricompilare e redistribuire.

Terzo punto separi la business logic, di accesso ai dati va sul DB, e del software resta nel compilato.

>>Utilizzi i parametri.
>Come faccio a passare dei parametri alla stored...hai un esempio
>che posso consultare per vedere ed apprendere???

Fai sul Framework SDK e cerca SqlParameter. Ci sono degli esempi lì.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

Grazie ciao
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