Totali nell'ultima riga della listview in visual studio 2008

martedì 23 giugno 2009 - 17.56

Mau67 Profilo | Expert

Ciao al forum, chiedo adesso di poter sommare le colonne che si popolano grazie all'aiuto di Jeremy
in questo Thared http://www.dotnethell.it/forum/messages.aspx?ThreadID=31191.

Devo sommare le colonne che vengono popolate con questo codice

''QUESTA PARTE L'HO AGGIUNTA IO
''=================================================
Select Case thisReader("TipoOp").ToString
Case "NU"
Case "UM"
For i As Integer = 0 To 2
item.SubItems.Add(New ListViewItem.ListViewSubItem)
Next
Case "CA"
For i As Integer = 0 To 5
item.SubItems.Add(New ListViewItem.ListViewSubItem)
Next
End Select
''=================================================

e inserire i risultati per ogni colonna alla fine della listview.

Grazie in anticipo
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Credimi .... non lo faccio apposta ..... ma non ho capito!!!
Ho capito che vuoi fare la somma di qualcosa ed inserirla nell'ultima colonna del listview .... ma non ho capito cosa!.
O forse vuoi fare la somma di tutti i mesi, di tutti gli anni e di tutti i giorni .... e vuoi visualizzarli come ultimo record???

Ti prego di specificarlo così che, chiunque legga questo thread, non sia obbligato a leggere anche l'altro.

Facci sapere...
Ciao

Mau67 Profilo | Expert

voglio fare la somma di tutti i mesi, di tutti gli anni e di tutti i giorni .... e vuoi visualizzarli come ultimo record

Ciao
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Forse ti serviva un DataGridView .... piutto sto che un ListView......
Ad ogni modo, io lo risolverei così:

Dim Totali(30) As Long<----- QUESTO L'HO AGGIUNTO IO Dim Index As Integer<----- QUESTO L'HO AGGIUNTO IO While (thisReader.Read()) Index = 0<----- QUESTO L'HO AGGIUNTO IO Dim item As New ListViewItem(thisReader.Item(0).ToString, 0) item.SubItems.Add(thisReader.Item(1).ToString) item.SubItems.Add(thisReader.Item(2).ToString) item.SubItems.Add(thisReader.Item(3).ToString) item.SubItems.Add(thisReader.Item(4).ToString) Dim datTim1 As Date Dim datTim2 As Date datTim1 = Date.Parse(thisReader.Item(3).ToString) datTim2 = Date.Parse(thisReader.Item(4).ToString) Index = 4<----- QUESTO L'HO AGGIUNTO IO Select Case thisReader("TipoOp").ToString Case "NU" Case "UM" For i As Integer = 0 To 2 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1<----- QUESTO L'HO AGGIUNTO IO Next Case "CA" For i As Integer = 0 To 5 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1<----- QUESTO L'HO AGGIUNTO IO Next End Select 'ANNI Dim wY As Long wY = DateDiff("yyyy", datTim1, datTim2) If datTim2 < DateSerial(datTim2.Year, datTim1.Month, datTim1.Day) Then wY = wY - 1 item.SubItems.Add(wY.ToString) End If item.SubItems.Add(wY.ToString) Totali(Index) += wY<----- QUESTO L'HO AGGIUNTO IO Index += 1<----- QUESTO L'HO AGGIUNTO IO '-------------------------------- 'MESI Dim wM As Long wM = DateDiff("m", datTim1, datTim2) wM = wM - (wY * 12) If DatePart("d", datTim1) > DatePart("d", datTim2) Then wM = wM - 1 item.SubItems.Add(wM.ToString) End If item.SubItems.Add(wM.ToString) Totali(Index) += wM<----- QUESTO L'HO AGGIUNTO IO Index += 1<----- QUESTO L'HO AGGIUNTO IO '-------------------------------- 'GIORNI Dim GiornoInizio As Int32 Dim GiornoFine As Int32 Dim wD As Long Dim TempGiornoInizio As Date GiornoInizio = DatePart("d", datTim1) GiornoFine = DatePart("d", datTim2) If GiornoFine >= GiornoInizio Then wD = GiornoFine - GiornoInizio + 1 item.SubItems.Add(wD.ToString) Else TempGiornoInizio = DateAdd("m", -1, datTim2) wD = DateDiff("d", TempGiornoInizio, datTim2) - (GiornoInizio - GiornoFine) + 1 item.SubItems.Add(wD.ToString) End If Totali(Index) += wD <----- QUESTO L'HO AGGIUNTO IO Index += 1<----- QUESTO L'HO AGGIUNTO IO ListView1.Items.Add(item) End While ''QUESTA PARTE L'HO AGGIUNTA IO ''================================================= Dim TotItem As New ListViewItem For i = 0 To 4 TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) Next For Each tot As Long In Totali If tot > 0 Then TotItem.SubItems.Add(tot.ToString) Else TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) End If Next ''=================================================

Non lo ho provato, ma dovrebbe funzionare, eventualmente ... facci sapere....
Ciao

Mau67 Profilo | Expert

Jeremy il codice che mi hai passato non inserisce nessun totale.

Ciao
Mau67

Jeremy Profilo | Guru

OOooops .... io mi sono dimenticato una riga di codice .... ma tu mi sembra che abbia le basi per potertene accorgere.

Inserisci questa come ultima riga di codice:
ListView1.Items.Add(TotItem)

Ripeto .... non lo ho provato .... quindi potrebbe esserci ancora qualche errore.

Facci sapere...
Ciao

Mau67 Profilo | Expert

Si effettivamente dopo che ti ho scritto mi sono accorto della mancaza e avevo risolto subito, solo che giustamente così come è scritto le somme vengono fedelmente riportate e non va bene ti spiego

se la risultanza della somma tra le colonne ti faccio un esempio su tre colonne

anni mesi giorni
1 0 1
0 11 31


il codice somma cosi anni 1 mesi 11 giorni 32 invece la somma esatta è anni 2 mesi 0 giorni 2

io in passato avevo scritto questo codice che funziona solo con le colonne dove i dati vengono prese da una select in questo caso non riesco ad adattarle te le mostro vedi se riesci a darmi una mano

Dim DblTotaleAnniNU As Double
Dim DblTotaleMesiNU As Double
Dim DblTotaleGiorniNU As Double

'Ciclo tutte le righe e sommo il valore della colonna Giorni non utili

For i As Integer = 0 To Me.ListView1.Items.Count - 1
If IsNumeric((Me.ListView1.Items(i).SubItems(5).Text)) Then
DblTotaleGiorniNU += (Me.ListView1.Items(i).SubItems(5).Text)
End If
Next

' Visualizzo il risultato nella textbox
Me.txtGiorniNu.Text = CInt((((DblTotaleGiorniNU) / 30) - Fix(((DblTotaleGiorniNU) / 30))) * 30)



'Ciclo tutte le righe e sommo il valore della colonna Mesi non utili

For i As Integer = 0 To Me.ListView1.Items.Count - 1
If IsNumeric((Me.ListView1.Items(i).SubItems(4).Text)) Then
DblTotaleMesiNU += (Me.ListView1.Items(i).SubItems(4).Text)
End If
Next

' Visualizzo il risultato nella textbox
Me.txtMesiNu.Text = CInt(((((DblTotaleMesiNU) + (Fix(((DblTotaleGiorniNU) / 30))))) / 12 - (Fix(((DblTotaleMesiNU) + (Fix((DblTotaleGiorniNU) / 30))) / 12))) * 12)


'Ciclo tutte le righe e sommo il valore della colonna Anni non utili

For i As Integer = 0 To Me.ListView1.Items.Count - 1
If IsNumeric((Me.ListView1.Items(i).SubItems(3).Text)) Then
DblTotaleAnniNU += (Me.ListView1.Items(i).SubItems(3).Text)
End If
Next

' Visualizzo il risultato nella textbox
Me.txtAnniNu.Text = CInt((DblTotaleAnniNU) + (Fix(((DblTotaleMesiNU) + Fix(((DblTotaleGiorniNU) / 30))) / 12)))

questi codici che inserisco nelle text box calcolano esattamente le somme come ti ho detto sopra ( anni 2 mesi 0 giorni 2) e devono essere messi in questa sequenza


' Visualizzo il risultato nella textbox
Me.txtGiorniNu.Text = CInt((((DblTotaleGiorniNU) / 30) - Fix(((DblTotaleGiorniNU) / 30))) * 30)

' Visualizzo il risultato nella textbox
Me.txtMesiNu.Text = CInt(((((DblTotaleMesiNU) + (Fix(((DblTotaleGiorniNU) / 30))))) / 12 - (Fix(((DblTotaleMesiNU) + (Fix((DblTotaleGiorniNU) / 30))) / 12))) * 12)

' Visualizzo il risultato nella textbox
Me.txtAnniNu.Text = CInt((DblTotaleAnniNU) + (Fix(((DblTotaleMesiNU) + Fix(((DblTotaleGiorniNU) / 30))) / 12)))

Ciao

Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Ho capito .... bisognerebbe lavoarare con il tipo Date ... dammi un pò di tempo ... e vedo cosa riesco a far venir fuori.

Ciao

Mau67 Profilo | Expert

Ok grazie ciao
Mau67

Jeremy Profilo | Guru

Mauro! Ciao ....
Ma bisogna tener conto anche dei mesi che anno 30 giorni e di quelli che ne anno 31??? O ti basta che come totale giorni non ti visualli 32????

Mau67 Profilo | Expert

Bisogna tenere conto che se i giorni sono 30 o multipli bisogna sottrarli e aggungerli hai masi e chiaramente se i mesi sono 12 e ultpli bisogna sotrarre e aggiungerli agli anni
ciao
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Prova a vedere cosa salta fuori con questo codice:

Dim Totali(30) As Long Dim Index As Integer While (thisReader.Read()) Index = 0 Dim item As New ListViewItem(thisReader.Item(0).ToString, 0) item.SubItems.Add(thisReader.Item(1).ToString) item.SubItems.Add(thisReader.Item(2).ToString) item.SubItems.Add(thisReader.Item(3).ToString) item.SubItems.Add(thisReader.Item(4).ToString) Dim datTim1 As Date Dim datTim2 As Date datTim1 = Date.Parse(thisReader.Item(3).ToString) datTim2 = Date.Parse(thisReader.Item(4).ToString) Index += 4 Select Case thisReader("TipoOp").ToString Case "NU" Case "UM" For i As Integer = 0 To 2 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1 Next Case "CA" For i As Integer = 0 To 5 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1 Next End Select 'ANNI Dim wY As Long wY = DateDiff("yyyy", datTim1, datTim2) If datTim2 < DateSerial(datTim2.Year, datTim1.Month, datTim1.Day) Then wY = wY - 1 item.SubItems.Add(wY.ToString) End If item.SubItems.Add(wY.ToString) Totali(Index) += wY Index += 1 '-------------------------------- 'MESI Dim wM As Long wM = DateDiff("m", datTim1, datTim2) wM = wM - (wY * 12) If DatePart("d", datTim1) > DatePart("d", datTim2) Then wM = wM - 1 item.SubItems.Add(wM.ToString) End If item.SubItems.Add(wM.ToString) Totali(Index) += wM 'QUESTO L'HO AGGIUNTO IO '================================= If Totali(Index) > 11 Then Totali(Index) -= 12 Totali(Index - 1) += 1 End If '================================= Index += 1 '-------------------------------- 'GIORNI Dim GiornoInizio As Int32 Dim GiornoFine As Int32 Dim wD As Long Dim TempGiornoInizio As Date GiornoInizio = DatePart("d", datTim1) GiornoFine = DatePart("d", datTim2) If GiornoFine >= GiornoInizio Then wD = GiornoFine - GiornoInizio + 1 item.SubItems.Add(wD.ToString) Else TempGiornoInizio = DateAdd("m", -1, datTim2) wD = DateDiff("d", TempGiornoInizio, datTim2) - (GiornoInizio - GiornoFine) + 1 item.SubItems.Add(wD.ToString) End If 'QUESTO L'HO AGGIUNTO IO '================================= Totali(Index) += wD If Totali(Index) > 29 Then Totali(Index) += wD - 30 Totali(Index - 1) += 1 If Totali(Index - 1) > 11 Then Totali(Index - 1) -= 12 Totali(Index - 2) += 1 End If End If '================================= Index += 1 ListView1.Items.Add(item) End While Dim TotItem As New ListViewItem For i = 0 To 4 TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) Next For Each tot As Long In Totali If tot > 0 Then TotItem.SubItems.Add(tot.ToString) Else TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) End If Next ListView1.Items.Add(TotItem)

Facci sapere...
Ciao

Mau67 Profilo | Expert

Jeremy ok per anni e mesi invece i giorni non sottrae i 30 giorni e i suoi multipli

Ciao
Mau67

Mau67 Profilo | Expert

Allora Jeremy per i giorni ho risolto così

'QUESTO L'HO AGGIUNTO IO
'=================================
Totali(Index) += CInt((((wD.ToString) / 30) - Fix(((wD.ToString) / 30))) * 30)
If Totali(Index) > 29 Then
Totali(Index) += CInt((((wD.ToString) / 30) - Fix(((wD.ToString) / 30))) * 30)
Totali(Index - 1) += 1
If Totali(Index - 1) > 11 Then
Totali(Index - 1) -= 12
Totali(Index - 2) += 1
End If
End If
'=================================
usando una mia formula xrò adesso sballano mesi e anni se riuscissimo a usare le mie formule mettendole in sequenza perfetta il problema è risolto.

Ti riinserisco le mie formule e te le metto in sequenza giusta:

Giorni= CInt((((wD.ToString) / 30) - Fix(((wD.ToString) / 30))) * 30)

Mesi = CInt(((((wM.ToString) + (Fix(((wD.ToString / 30))))) / 12 - (Fix(((wM.ToString) + (Fix((wD.ToString) / 30))) / 12))) * 12)

Anni = CInt((wY.ToString) + (Fix(((wM.ToString) + Fix(((wD.ToString) / 30))) / 12)))

Se riusciamo a posizionarli così funzionerà sicuramente

Ciao

Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Probabilmente il problema era solo un errore nel codice guarda la riga contrassegnata con ERRORE:

Dim Totali(30) As Long Dim Index As Integer While (thisReader.Read()) Index = 0 Dim item As New ListViewItem(thisReader.Item(0).ToString, 0) item.SubItems.Add(thisReader.Item(1).ToString) item.SubItems.Add(thisReader.Item(2).ToString) item.SubItems.Add(thisReader.Item(3).ToString) item.SubItems.Add(thisReader.Item(4).ToString) Dim datTim1 As Date Dim datTim2 As Date datTim1 = Date.Parse(thisReader.Item(3).ToString) datTim2 = Date.Parse(thisReader.Item(4).ToString) Index += 4 Select Case thisReader("TipoOp").ToString Case "NU" Case "UM" For i As Integer = 0 To 2 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1 Next Case "CA" For i As Integer = 0 To 5 item.SubItems.Add(New ListViewItem.ListViewSubItem) Index += 1 Next End Select 'ANNI Dim wY As Long wY = DateDiff("yyyy", datTim1, datTim2) If datTim2 < DateSerial(datTim2.Year, datTim1.Month, datTim1.Day) Then wY = wY - 1 item.SubItems.Add(wY.ToString) End If item.SubItems.Add(wY.ToString) Totali(Index) += wY Index += 1 '-------------------------------- 'MESI Dim wM As Long wM = DateDiff("m", datTim1, datTim2) wM = wM - (wY * 12) If DatePart("d", datTim1) > DatePart("d", datTim2) Then wM = wM - 1 item.SubItems.Add(wM.ToString) End If item.SubItems.Add(wM.ToString) Totali(Index) += wM 'QUESTO L'HO AGGIUNTO IO '================================= If Totali(Index) > 11 Then Totali(Index) -= 12 Totali(Index - 1) += 1 End If '================================= Index += 1 '-------------------------------- 'GIORNI Dim GiornoInizio As Int32 Dim GiornoFine As Int32 Dim wD As Long Dim TempGiornoInizio As Date GiornoInizio = DatePart("d", datTim1) GiornoFine = DatePart("d", datTim2) If GiornoFine >= GiornoInizio Then wD = GiornoFine - GiornoInizio + 1 item.SubItems.Add(wD.ToString) Else TempGiornoInizio = DateAdd("m", -1, datTim2) wD = DateDiff("d", TempGiornoInizio, datTim2) - (GiornoInizio - GiornoFine) + 1 item.SubItems.Add(wD.ToString) End If 'QUESTO L'HO AGGIUNTO IO '================================= Totali(Index) += wD If Totali(Index) > 29 Then 'Totali(Index) += wD - 30 <------------ERRORE Totali(Index) -= 30 <------------CORRETTO Totali(Index - 1) += 1 If Totali(Index - 1) > 11 Then Totali(Index - 1) -= 12 Totali(Index - 2) += 1 End If End If '================================= Index += 1 ListView1.Items.Add(item) End While Dim TotItem As New ListViewItem For i = 0 To 4 TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) Next For Each tot As Long In Totali If tot > 0 Then TotItem.SubItems.Add(tot.ToString) Else TotItem.SubItems.Add(New ListViewItem.ListViewSubItem) End If Next ListView1.Items.Add(TotItem)

Prova a vedere se così va bene....
Facci sapere...
Ciao

Mau67 Profilo | Expert

Ok Jeremy il codicè è ok i calcoli li fà giusti.

Adesso nello stesso form ho un secondo listview2 qui carico i dati con la seguente select

Dim sql As String = "SELECT IDAna, Dal, Operativa FROM Operativa WHERE IDAna = '" & ComboBox1.SelectedValue & "' order by Dal"

adesso vorrei che leggesse i dati delle colonne anni, mesi e giorni dalla Listview1 in base a < Dal di questa select, e calcolasse i totali e i totali li iserisca nella listview2

Ciao grazie
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Sono sempre più convinto che hai sbagliato la scelta dei controlli....ad ogni modo .... gestirei la cosa lasciando perdere quello che c'è nel primo listview.
Nel primo listview, quello che è fatto è fatto!!!

Se hai bisogno di fare ancora ragionamenti sui dati, ti consiglio fortemente di popolare un dataset contenente le opportune datatable.
Mi credi se ti dico una cosa ???? Ti semplifichi la vita non 7000 ... ma 140000 volte.

In questo modo, puoi sfruttare davvero tante tecniche, una performante più dell'altra, per recuperare i dati in funzione di qualsiasi criterio tu voglia.

Rimango comunque a disposizione per ulteriori sviluppi od info in merito.

Facci sapere...
Ciao.

Mau67 Profilo | Expert

ok Jeremy accetto il consiglio, ma si può popolare il dataset con quei tre campi del database e il resto dei dati come abbiamo fatto per il listview popolato in precedenza senza che i risultati vengano salvati in tabella?

ciao
Mau67

Jeremy Profilo | Guru

Certo che si .... il dataset non è niente altro che un mero contenitore di dati....niente più ... e si utilizza proprio a questi scopi.

Ciao

Mau67 Profilo | Expert

Ok vorresti mostrarmi con i dati che ti ho postato come fare? per popolare il secondo listview.

Grazie
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Andiamo per gradi ... comincia ad adoperare questo codice per popolare il datset con i record filtrati secondo i tuoi criteri:

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

Come al solito ..... non l'ho provato ... quindi gestisci tu eventuali adattamenti al tuo scenario.

Facci sapere....
Ciao

Mau67 Profilo | Expert

Ok adesso come popolo il listview2?

qui mi da errore Da.Fill(Ds, "Tabella1")

Impossibile convertire il valore del parametro da un String a un Int32.

Ciao
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
L'errore è dovuto, probabilmente al fatto che, ho dato per scontatato che IdAna, nella tabella del db, fosse un campo di tipo Intero (come dovrebbe esserlo un campo di identità record) ... invece, probabilmente, tu hai deciso di tipizzarlo String.
Il passo corretto da fare, sarebbe quello di modificare il tipo di campo nella tabella del db ... ma, se vuoi, per il momento puoi modificare il valore della proprietà SqlDbType a String anzichè Int...giusto per verificare che l'errore sia dovuto veramente a quello.

Comincia a sistemare questa cosa...
Ciao.

Mau67 Profilo | Expert

si risolto ok ti posto il codice con cui popolo il listview

Private Sub PopolaDataset()

If Not File.Exists(FILE_NAME) Then
MsgBox(FILE_NAME & " Stringa di connessione mancante.")
Return
End If
Dim sr As StreamReader = File.OpenText(FILE_NAME)
Dim sqlString As String
sqlString = sr.ReadLine()
Me.ToolStripStatusLabel2.Text = (sqlString) 'Questo è solo per verificare!
sr.Close()

Dim objConnection As New SqlConnection(sqlString)

Cmd = New SqlClient.SqlCommand("SELECT Operativa.ID, Operativa.IDAna, Operativa.Dal, TipologiaOperative.Operativa" & _
" FROM Operativa INNER JOIN TipologiaOperative ON Operativa.Operativa = TipologiaOperative.ID" & _
" WHERE (Operativa.IDAna = @IDAna) ORDER BY Operativa.Dal", objConnection)
Cmd.Parameters.Add(New SqlClient.SqlParameter With {.ParameterName = "@IDAna", .SqlDbType = SqlDbType.VarChar, .Value = ComboBox1.SelectedValue})
Da = New SqlClient.SqlDataAdapter(Cmd)
Ds = New DataSet
Da.Fill(Ds, "Tabella1")


' Svuota la casella ListView1 e
' la casella di testo
ListView2.Items.Clear()




' Set the view to show details.
ListView2.View = View.Details
' Allow the user to edit item text.
ListView2.LabelEdit = True
' Allow the user to rearrange columns.
ListView2.AllowColumnReorder = True
' Display check boxes.
ListView2.CheckBoxes = False
' Select the item and subitems when selection is made.
ListView2.FullRowSelect = True
' Display grid lines.
ListView2.GridLines = True
' Sort the items in the list in ascending order.
ListView2.Sorting = SortOrder.Ascending




Try



objConnection.Open()

Dim thisReader As SqlClient.SqlDataReader = Cmd.ExecuteReader()

While (thisReader.Read())
Dim item As New ListViewItem(thisReader.Item(0).ToString, 0)
item.SubItems.Add(thisReader.Item(1).ToString)
item.SubItems.Add(thisReader.Item(2).ToString)
item.SubItems.Add(thisReader.Item(3).ToString)
ListView2.Items.AddRange(New ListViewItem() {item})


End While


ListView2.Columns.Add("ID", 100, HorizontalAlignment.Left)
ListView2.Columns.Add("ID AMM", 100, HorizontalAlignment.Left)
ListView2.Columns.Add("Dal", 100, HorizontalAlignment.Left)
ListView2.Columns.Add("OPERATIVA", 150, HorizontalAlignment.Left)

Dim imageListSmall As New ImageList()
Dim imageListLarge As New ImageList()

' Initialize the ImageList objects with bitmaps.
imageListSmall.Images.Add(Bitmap.FromFile(Application.StartupPath & "\Ico\ok.ico"))


'Assign the ImageList objects to the ListView.
ListView2.LargeImageList = imageListLarge
ListView2.SmallImageList = imageListSmall


Catch ex As SqlClient.SqlException
MsgBox("Error: " & ex.ToString())
Finally
objConnection.Close()
End Try
End Sub

Ok adesso come per l'altro listview dobbiamo inserire i totali in anni mesi e giorni filtrati dal campo DAL quindi <Dal e inserire i totali in anni mesi e giorni come per l'altro listview ma solo i totali
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Innanzitutto, avendo popolato un dataset, non hai più bisogno di utilizzare un datreader per leggere i dati modalità connessa.
E' sufficiente che tu li estragga dal Datatable che hai popolato con il metodo Fill del DataAdapter.
Quindi, il tuo codice, andrebbe modificato così:

Try Listview2.Columns.Add("ID", 100, HorizontalAlignment.Left) Listview2.Columns.Add("ID AMM", 100, HorizontalAlignment.Left) Listview2.Columns.Add("Dal", 100, HorizontalAlignment.Left) Listview2.Columns.Add("OPERATIVA", 150, HorizontalAlignment.Left) For Each Row As DataRow In Ds.Tables("Tabella1").Rows Dim item As New ListViewItem(Row("ID").ToString, 0) item.SubItems.Add(Row("IDAna").ToString) item.SubItems.Add(Row("Dal").ToString) item.SubItems.Add(Row("Operativa").ToString) Listview2.Items.Add(item) Next Dim imageListSmall As New ImageList() Dim imageListLarge As New ImageList() imageListSmall.Images.Add(Bitmap.FromFile(Application.StartupPath & "\Ico\ok.ico")) Listview2.LargeImageList = imageListLarge Listview2.SmallImageList = imageListSmall Catch ex As SqlClient.SqlException MessageBox.Show("Error: " & ex.ToString()) End Try

Per il resto, non ho capito bene i criteri per il filtraggio dei dati .... ho capito che devi fare il totale come per l'altro listview ... ma non ho capito in funzione di cosa.
Ti prego di metterci magari anche 2 righe in più ... ma di spiegarlo bene ... magari facendo anche qualche esempio pratico ..... altrimenti rischiamo solo di perder tempo tutti e due.

Facci sapere.....
Ciao

Mau67 Profilo | Expert

Ciao Jeremy, sai intanto ti rimgrazio per il grande aiuto che mi dai, poi dopo una riflessione ho pensato di non caricare tutti i dati nella seconda listview ma tenerla cosi come ma di trasferire i calcoli in un report selezionando il o i checkbox credi sia una soluzione più razionale?

grazie
Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Dipende dalle tue esigenze ... ad ogni modo, se vuoi fare dei calcoli a run-time e, successivamente, visualizzarli in un report .... c'è la forte eventualità che tu abbia comunque bisogno di popolare un dataset da passare poi al Report. (come ti ho risposto qui http://www.dotnethell.it/forum/messages.aspx?ThreadID=31333)

Ad ogni modo, se hai bisogno .... facci sapere...
Ciao

Mau67 Profilo | Expert

Ciao Jeremiy, allora tornando al progetto, devo costruire un report partendo dalla select con cui popolo la listview2 in più devo trovare i totali che nella listview1 trasforma in anni mesi e giorni e li somma per poi inserirli in base al filtro (Campo inferiore dal a al della select listview1) della select (listview2) e devo anche inserire delle variabili

Ciao

Mau67

Jeremy Profilo | Guru

Ciao Mauro.
Ma il report lo hai già progettato?
Se si .... e se devi fare gli stessi calcoli che abbiamo fatto a run-time, devi popolare un'istanza della DataTable che hai usato in progettazione del Report e passarla al report con il metodo SetDataSource del ReportViewer.
Ad ogni modo ....se ti tiferisci al thread che hai aperto nella sezione Reportistica ..... continuiamo quello, così questo, eventualmente, lo chiudiamo.

Facci sapere...
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