Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Intera tabella di un Database su una ListView
Forum - C# / VB.NET - Intera tabella di un Database su una ListView

Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 17:45
Giovedì, 13/09/2012
Come avevo premesso nell'ultimo intervento mi sto cimentando da poco al vb.net

Sto creando un software gestionale interfacciato con un database access e ho la necessità di portare un'intera tabella del database ad una listview, il problema è che all'interno del database ho più tabelle con un diverso numero di colonne, quindi mi serve cancellare e ricreare lo schema delle colonne della listview in modo automatico, per ogni tabella che apro.

Questo è il codice da me usato (ma non va mi da pure errore, ma ne ho provato cosi tanti che sono finito qui per chiedervi una mano)

Codice sorgente - presumibilmente VB.NET

  1. Private Sub CmdCatVis_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdCatVis.Click
  2.         Dim Cat As String
  3.         Dim i As Integer
  4.         Dim a() As String
  5.         Dim DataSet2 As New Data.DataSet
  6.         a = Nothing
  7.         i = 0
  8.         Cat = ComboCat.Text
  9.  
  10.         Dim archivio As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb")
  11.  
  12.         Dim selezione = New OleDbDataAdapter("SELECT * FROM " & Cat & "", archivio)
  13.         selezione.FillSchema(DataSet2, SchemaType.Source, Cat)
  14.         selezione.Fill(DataSet2, Cat)
  15.         archivio.Close()
  16.  
  17.         Dim DataTable1 As New Data.DataTable
  18.  
  19.         DataTable1 = DataSet2.Tables(Cat)
  20.  
  21.         Dim nc As Integer = DataSet2.Tables(0).Columns.Count
  22.  
  23.         For i = 0 To (nc = nc - 1)
  24.             a(i) = (DataSet2.Tables(Cat).Columns(i).ColumnName())
  25.             ListView1.Columns.Add(a(i))
  26.         Next
  27.  
  28.         Dim x As DataRow
  29.         For Each x In DataTable1.Rows
  30.             For i = 0 To (nc = nc - 1)
  31.                 ListView1.Items.Add(x(a(i)).ToString())
  32.             Next i
  33.         Next x
  34.  
  35.     End Sub



ovviamente ciò che non è dichiarato in questa parte di codice è dichiarato pubblicamente :)

PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 18:03
Giovedì, 13/09/2012
la cosa migliore sarebbe usare l'oggetto DataGridView

però spesso è più comodo e esteticamente più funzionale una ListView, ammetto che è una soluzione della quale abuso pure io

qui una procedura per fare ciò che cerchi, è molto semplice anche da capire quindi non penso che farai fatica a comprendere quello che fa

alla procedura va passata la listview e la datatable con i dati che serve per riempire la listview
Codice sorgente - presumibilmente VB.NET

  1. Public Sub FillListView(ByRef MyListView As ListView, _
  2.                           ByRef myData As DataTable)
  3.  
  4.     Dim lvwColumn As ColumnHeader
  5.     Dim itmListItem As ListViewItem
  6.     Dim shtCntr As Short
  7.  
  8.     MyListView.Clear()
  9.  
  10.     For shtCntr = 0 To myData.Columns.Count - 1
  11.       lvwColumn = New ColumnHeader()
  12.       lvwColumn.Text = myData.Columns(shtCntr).ColumnName
  13.       MyListView.Columns.Add(lvwColumn)
  14.     Next
  15.  
  16.     For i As Integer = 0 To myData.Rows.Count - 1
  17.       itmListItem = New ListViewItem()
  18.       itmListItem.Text = myData.Rows(i)(0).ToString
  19.  
  20.       For shtCntr = 1 To myData.Columns.Count - 1
  21.         If IsDBNull(myData.Rows(i)(shtCntr)) Then
  22.           itmListItem.SubItems.Add("")
  23.         Else
  24.           itmListItem.SubItems.Add(myData.Rows(i)(shtCntr))
  25.         End If
  26.       Next shtCntr
  27.  
  28.       MyListView.Items.Add(itmListItem)
  29.     Next i
  30.   End Sub


Ultima modifica effettuata da ampeg il 13/09/2012 alle 18:07
PM Quote
Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 18:15
Giovedì, 13/09/2012
Grazie mille, ho più o meno compreso ciò che fa, spero solo di esser in grado di modificarla correttamente, lo faccio immediatamente e ti faccio sapere grazie ancora :)


Testo quotato

Postato originariamente da ampeg:

la cosa migliore sarebbe usare l'oggetto DataGridView

però spesso è più comodo e esteticamente più funzionale una ListView, ammetto che è una soluzione della quale abuso pure io

qui una procedura per fare ciò che cerchi, è molto semplice anche da capire quindi non penso che farai fatica a comprendere quello che fa

alla procedura va passata la listview e la datatable con i dati che serve per riempire la listview


PM Quote
Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 18:25
Giovedì, 13/09/2012
Ho integrato il tuo codice al mio se pur un po disordinato questo è il risultato:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub CmdCatVis_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdCatVis.Click
  2.         Dim Cat As String
  3.  
  4.         Dim DataSet2 As New Data.DataSet
  5.  
  6.         Cat = ComboCat.Text
  7.  
  8.         Dim archivio As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb")
  9.  
  10.         Dim selezione = New OleDbDataAdapter("SELECT * FROM " & Cat & "", archivio)
  11.         selezione.FillSchema(DataSet2, SchemaType.Source, Cat)
  12.         selezione.Fill(DataSet2, Cat)
  13.         archivio.Close()
  14.  
  15.         Dim DataTable1 As New Data.DataTable
  16.  
  17.         DataTable1 = DataSet2.Tables(Cat)
  18.  
  19.         Dim lvwColumn As ColumnHeader
  20.         Dim itmListItem As ListViewItem
  21.         Dim shtCntr As Short
  22.  
  23.         ListView1.Clear()
  24.  
  25.         For shtCntr = 0 To DataTable1.Columns.Count - 1
  26.             lvwColumn = New ColumnHeader()
  27.             lvwColumn.Text = DataTable1.Columns(shtCntr).ColumnName
  28.             ListView1.Columns.Add(lvwColumn)
  29.         Next
  30.  
  31.         For i As Integer = 0 To DataTable1.Rows.Count - 1
  32.             itmListItem = New ListViewItem()
  33.             itmListItem.Text = DataTable1.Rows(i)(0).ToString
  34.  
  35.             For shtCntr = 1 To DataTable1.Columns.Count - 1
  36.                 If IsDBNull(DataTable1.Rows(i)(shtCntr)) Then
  37.                     itmListItem.SubItems.Add("")
  38.                 Else
  39.                     itmListItem.SubItems.Add(DataTable1.Rows(i)(shtCntr))
  40.                 End If
  41.             Next shtCntr
  42.  
  43.             ListView1.Items.Add(itmListItem)
  44.         Next i
  45.  
  46.     End Sub



Nel momento dell'esecuzione non mi da errori, il risultato che mi da però è solo una checkbox con il valore "1", premetto che attualmente nella tabella "Affiliati" (Tabella di Prova) ho solo un record, riporto degli screenshots per facilitare la comprensione... non capisco dove sbaglio :(






Testo quotato

Postato originariamente da WillyVB:

Grazie mille, ho più o meno compreso ciò che fa, spero solo di esser in grado di modificarla correttamente, lo faccio immediatamente e ti faccio sapere grazie ancora :)


Testo quotato

Postato originariamente da ampeg:

la cosa migliore sarebbe usare l'oggetto DataGridView

però spesso è più comodo e esteticamente più funzionale una ListView, ammetto che è una soluzione della quale abuso pure io

qui una procedura per fare ciò che cerchi, è molto semplice anche da capire quindi non penso che farai fatica a comprendere quello che fa

alla procedura va passata la listview e la datatable con i dati che serve per riempire la listview




WillyVB ha allegato un file: Screen1.jpg (239232 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 19:11
Giovedì, 13/09/2012
aggiungi il codice o imposta manualmente la proprietà View della ListView1

Codice sorgente - presumibilmente Plain Text

  1. ListView1.View = View.Details




invece di integrare il codice dovresti adattarlo in modo da richiamare la procedura (la procedura "FillListView" la copiincolli nel codice del tuo form)

poi prova a recuperare la datatable in questo modo:

Codice sorgente - presumibilmente VB.NET

  1. Dim cn As New OleDb.OleDbConnection
  2. Dim cmd As New OleDbCommand
  3. Dim da As New OleDbDataAdapter
  4. Dim dt As New DataTable
  5.  
  6. cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb"
  7. cn.Open()
  8. cmd.Connection = cn
  9. cmd.CommandText = "SELECT * FROM " & Cat
  10. da.SelectCommand = cmd
  11. da.Fill(dt)
  12. cn.Close()
  13.  
  14. Call FillListView(ListView1, dt)
  15.  
  16. 'qui va il codice per ridimensionare le colonne della listview


Ultima modifica effettuata da ampeg il 13/09/2012 alle 19:21
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 19:25
Giovedì, 13/09/2012
ovviamente il disguido era la proprietà della ListView che di default è messa come LargeIcon mentre per l'occasione va impostata su Details, poichè dobbiamo ottenere una visualizzazione tabellare (colonne e righe)

il tuo codice per il recupero del datatable è comunque utilizzabile

Ultima modifica effettuata da ampeg il 13/09/2012 alle 19:27
PM Quote
Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 9:23
Venerdì, 14/09/2012
Mea Culpa :)

Ho giusto modificato la proprietà della ListView non c'è stato nemmeno bisogno di richiamare la funzione FillListView, una volta modificata la proprietà è andato tutto liscio :D ti ringrazio tantissimo :D

Sicuramente ci vedremo su prossimi errori dato che sono ancora un novizio in questo linguaggio, spesso sbaglio e cerco di comprendere quanto più possibile tramite guide ed esempi su internet... ma non sempre ci riesco eheheh

Grazie ancora :)

Testo quotato

Postato originariamente da ampeg:

ovviamente il disguido era la proprietà della ListView che di default è messa come LargeIcon mentre per l'occasione va impostata su Details, poichè dobbiamo ottenere una visualizzazione tabellare (colonne e righe)

il tuo codice per il recupero del datatable è comunque utilizzabile


PM Quote