WillyVB (Normal User)
Rookie
Messaggi: 31
Iscritto: 30/12/2011
|
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 |
Private Sub CmdCatVis_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdCatVis.Click Dim Cat As String Dim i As Integer Dim a() As String Dim DataSet2 As New Data.DataSet a = Nothing i = 0 Cat = ComboCat.Text Dim archivio As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb") Dim selezione = New OleDbDataAdapter("SELECT * FROM " & Cat & "", archivio) selezione.FillSchema(DataSet2, SchemaType.Source, Cat) selezione.Fill(DataSet2, Cat) archivio.Close() Dim DataTable1 As New Data.DataTable DataTable1 = DataSet2.Tables(Cat) Dim nc As Integer = DataSet2.Tables(0).Columns.Count For i = 0 To (nc = nc - 1) a(i) = (DataSet2.Tables(Cat).Columns(i).ColumnName()) ListView1.Columns.Add(a(i)) Next Dim x As DataRow For Each x In DataTable1.Rows For i = 0 To (nc = nc - 1) ListView1.Items.Add(x(a(i)).ToString()) Next i Next x End Sub
|
ovviamente ciò che non è dichiarato in questa parte di codice è dichiarato pubblicamente
|
|
ampeg (Normal User)
Pro
Messaggi: 124
Iscritto: 21/04/2011
|
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 |
Public Sub FillListView(ByRef MyListView As ListView, _ ByRef myData As DataTable) Dim lvwColumn As ColumnHeader Dim itmListItem As ListViewItem Dim shtCntr As Short MyListView.Clear() For shtCntr = 0 To myData.Columns.Count - 1 lvwColumn = New ColumnHeader() lvwColumn.Text = myData.Columns(shtCntr).ColumnName MyListView.Columns.Add(lvwColumn) Next For i As Integer = 0 To myData.Rows.Count - 1 itmListItem = New ListViewItem() itmListItem.Text = myData.Rows(i)(0).ToString For shtCntr = 1 To myData.Columns.Count - 1 If IsDBNull(myData.Rows(i)(shtCntr)) Then itmListItem.SubItems.Add("") Else itmListItem.SubItems.Add(myData.Rows(i)(shtCntr)) End If Next shtCntr MyListView.Items.Add(itmListItem) Next i End Sub
|
Ultima modifica effettuata da ampeg il 13/09/2012 alle 18:07 |
|
WillyVB (Normal User)
Rookie
Messaggi: 31
Iscritto: 30/12/2011
|
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
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 (Normal User)
Rookie
Messaggi: 31
Iscritto: 30/12/2011
|
Ho integrato il tuo codice al mio se pur un po disordinato questo è il risultato:
Codice sorgente - presumibilmente VB.NET |
Private Sub CmdCatVis_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdCatVis.Click Dim Cat As String Dim DataSet2 As New Data.DataSet Cat = ComboCat.Text Dim archivio As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb") Dim selezione = New OleDbDataAdapter("SELECT * FROM " & Cat & "", archivio) selezione.FillSchema(DataSet2, SchemaType.Source, Cat) selezione.Fill(DataSet2, Cat) archivio.Close() Dim DataTable1 As New Data.DataTable DataTable1 = DataSet2.Tables(Cat) Dim lvwColumn As ColumnHeader Dim itmListItem As ListViewItem Dim shtCntr As Short ListView1.Clear() For shtCntr = 0 To DataTable1.Columns.Count - 1 lvwColumn = New ColumnHeader() lvwColumn.Text = DataTable1.Columns(shtCntr).ColumnName ListView1.Columns.Add(lvwColumn) Next For i As Integer = 0 To DataTable1.Rows.Count - 1 itmListItem = New ListViewItem() itmListItem.Text = DataTable1.Rows(i)(0).ToString For shtCntr = 1 To DataTable1.Columns.Count - 1 If IsDBNull(DataTable1.Rows(i)(shtCntr)) Then itmListItem.SubItems.Add("") Else itmListItem.SubItems.Add(DataTable1.Rows(i)(shtCntr)) End If Next shtCntr ListView1.Items.Add(itmListItem) Next i 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
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
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
|
|
|
|
ampeg (Normal User)
Pro
Messaggi: 124
Iscritto: 21/04/2011
|
aggiungi il codice o imposta manualmente la proprietà View della ListView1
Codice sorgente - presumibilmente Plain Text |
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 |
Dim cn As New OleDb.OleDbConnection Dim cmd As New OleDbCommand Dim da As New OleDbDataAdapter Dim dt As New DataTable cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "/DB.mdb" cn.Open() cmd.Connection = cn cmd.CommandText = "SELECT * FROM " & Cat da.SelectCommand = cmd da.Fill(dt) cn.Close() Call FillListView(ListView1, dt) 'qui va il codice per ridimensionare le colonne della listview
|
Ultima modifica effettuata da ampeg il 13/09/2012 alle 19:21 |
|
ampeg (Normal User)
Pro
Messaggi: 124
Iscritto: 21/04/2011
|
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 |
|
WillyVB (Normal User)
Rookie
Messaggi: 31
Iscritto: 30/12/2011
|
|
|