Oppure

Loading
13/09/12 15:45
WillyVB
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)

   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 :)
aaa
13/09/12 16:03
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

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 13/09/12 16:07
aaa
13/09/12 16:15
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
aaa
13/09/12 16:25
WillyVB
Ho integrato il tuo codice al mio se pur un po disordinato questo è il risultato:

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
aaa
13/09/12 17:11
ampeg
aggiungi il codice o imposta manualmente la proprietà View della ListView1

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:

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 13/09/12 17:21
aaa
13/09/12 17:25
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
Ultima modifica effettuata da ampeg 13/09/12 17:27
aaa
14/09/12 7:23
WillyVB
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 :)

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
aaa