Listview in visual studio 2008 e SQLServer 2005 express

domenica 21 giugno 2009 - 15.04

Mau67 Profilo | Expert

Ciao al forum,

Problema di caricamento dati su listview, mi spego

carico i dati da una select la posto:

Dim sql As String = "SELECT Trascinamenti.ID, Trascinamenti.TipoOp, Reparti.Reparto + ' ' + Reparti.Città AS Reparto, Trascinamenti.Dal, Trascinamenti.Al FROM Reparti INNER JOIN Trascinamenti ON Reparti.ID = Trascinamenti.Reparto WHERE IDAna = '" & ComboBox1.SelectedValue & "' order by Dal"

fin qui tutto bene ma appena voglio inserire dei dati in posizioni prestabilite mi va in errore

Praticamente la mia Listview ha 31 colonne di cui dalla colonna 0 alla colonna 4 devo caricare i dati della select invece dalla colonna 5 alla colonna 31 devo caricare il risultato della differenza tra due date quindi (datediff) trasformati in anni mesi e giorni e incolonnati in base al Trascinamenti.TipoOp che si trova nella select

Esempio lo allego

posto anche il codice che uso per il caricamento della listview

Private Sub ListView_Select()

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 thisConnection As New SqlClient.SqlConnection(sqlString)

Me.ToolStripStatusLabel1.Text = idTrascinamento
Me.ToolStripStatusLabel3.Text = TipoOp


Dim sql As String = "SELECT Trascinamenti.ID, Trascinamenti.TipoOp, Reparti.Reparto + ' ' + Reparti.Città AS Reparto, Trascinamenti.Dal, Trascinamenti.Al FROM Reparti INNER JOIN Trascinamenti ON Reparti.ID = Trascinamenti.Reparto WHERE IDAna = '" & ComboBox1.SelectedValue & "' order by Dal"

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

Dim thisCommand As New SqlClient.SqlCommand(sql, thisConnection)



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



Try

Me.ListView1.Columns.Clear()


thisConnection.Open()


Dim thisReader As SqlClient.SqlDataReader = thisCommand.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)
item.SubItems.Add(thisReader.Item(4).ToString)
ListView1.Items.AddRange(New ListViewItem() {item})

Dim datTim1 As Date
Dim datTim2 As Date

datTim1 = thisReader.Item(3).ToString
datTim2 = thisReader.Item(4).ToString

'ANNI
Dim wY As Object
wY = DateDiff("yyyy", datTim1, datTim2)
If datTim2 < DateSerial(datTim2.Year, datTim1.Month, datTim1.Day) Then
wY = wY - 1
item.SubItems.Add(wY)
End If
item.SubItems.Add(wY)
'--------------------------------
'MESI
Dim wM As Object
wM = DateDiff("m", datTim1, datTim2)
wM = wM - (wY * 12)
If DatePart("d", datTim1) > DatePart("d", datTim2) Then
wM = wM - 1
item.SubItems.Add(wM)
End If
item.SubItems.Add(wM)
'--------------------------------
'GIORNI
Dim GiornoInizio As Object
Dim GiornoFine As Object
Dim wD As Object
Dim TempGiornoInizio As Object
GiornoInizio = DatePart("d", datTim1)
GiornoFine = DatePart("d", datTim2)
If GiornoFine >= GiornoInizio Then
wD = GiornoFine - GiornoInizio + 1
item.SubItems.Add(wD)
Else
TempGiornoInizio = DateAdd("m", -1, datTim2)
wD = DateDiff("d", TempGiornoInizio, datTim2) - (GiornoInizio - GiornoFine) + 1
item.SubItems.Add(wD)
End If

End While
ListView1.Columns.Add("ID", 5, HorizontalAlignment.Center)
ListView1.Columns.Add("TipoOp", 5, HorizontalAlignment.Center)
ListView1.Columns.Add("REPARTO", 250, HorizontalAlignment.Left)
ListView1.Columns.Add("DAL", 80, HorizontalAlignment.Left)
ListView1.Columns.Add("AL", 80, HorizontalAlignment.Left)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("A", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("M", 30, HorizontalAlignment.Center)
ListView1.Columns.Add("G", 30, HorizontalAlignment.Center)



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.
ListView1.LargeImageList = imageListLarge
ListView1.SmallImageList = imageListSmall



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


End Sub

Grazie in anticipo
Mau67

Jeremy Profilo | Guru

Ciao.
Puoi dirci che tipo di errore ricevi ad in quale punto del codice????
Facci sapere....
Ciao

Mau67 Profilo | Expert

Se aggiungo un item qui:

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)
item.SubItems.Add(thisReader.Item(4).ToString)
item.SubItems.Add(thisReader.Item(5).ToString) <<<<<<<< aggiunto qui
ListView1.Items.AddRange(New ListViewItem() {item})


mi genera l'eccezzione che allego

sicuramente perchè la select ha solo 5 campi e così deve rimanere, quindi devo trovare un alternativa per fargli visualizzare quelli calcolati nel form

Ciao grazie
Mau67

Jeremy Profilo | Guru

Ciao.
Ti sei risposto da solo!!.
E' ovvio che avendo cinque campi gestiti nella query .... non puoi andare oltre l'indice 4 del reader.

Facci sapere...
Ciao.

Mau67 Profilo | Expert

Si ma non c'è un modo per visualizzare nella stessa listview oltre hai campi della select anche i calcoli derivati dalla select stessa?

ciao
Mau67

Jeremy Profilo | Guru

Ciao.
Nella ListView puoi mettere quello che vuoi .... il problema è da dove prendi i dati per inserirli nella ListView.
Se li vuoi disponibili nel DataReader, devi includerli nella query ..... non mi sembra che tu includa più di 5 campi nella query.

Ti prego di scusarmi ... ma non riesco a capire il problema.
Rimango comunque in attesa di ulteriori dettagli.

Facci sapere...
Ciao

Mau67 Profilo | Expert

Se guardi ben ho inserito tutto il codice che uso nel mio form, adesso i risultati della select li prendo in questo punto:

Dim datTim1 As Date
Dim datTim2 As Date

datTim1 = thisReader.Item(3).ToString
datTim2 = thisReader.Item(4).ToString

'ANNI
Dim wY As Object
wY = DateDiff("yyyy", datTim1, datTim2)
If datTim2 < DateSerial(datTim2.Year, datTim1.Month, datTim1.Day) Then
wY = wY - 1
item.SubItems.Add(wY)
End If
item.SubItems.Add(wY)
'--------------------------------
'MESI
Dim wM As Object
wM = DateDiff("m", datTim1, datTim2)
wM = wM - (wY * 12)
If DatePart("d", datTim1) > DatePart("d", datTim2) Then
wM = wM - 1
item.SubItems.Add(wM)
End If
item.SubItems.Add(wM)
'--------------------------------
'GIORNI
Dim GiornoInizio As Object
Dim GiornoFine As Object
Dim wD As Object
Dim TempGiornoInizio As Object
GiornoInizio = DatePart("d", datTim1)
GiornoFine = DatePart("d", datTim2)
If GiornoFine >= GiornoInizio Then
wD = GiornoFine - GiornoInizio + 1
item.SubItems.Add(wD)
Else
TempGiornoInizio = DateAdd("m", -1, datTim2)
wD = DateDiff("d", TempGiornoInizio, datTim2) - (GiornoInizio - GiornoFine) + 1
item.SubItems.Add(wD)
End If


Solo che questi item:

item.SubItems.Add(wY)
item.SubItems.Add(wM)
item.SubItems.Add(wD)

li vorrei inserire magari esempio:
item.SubItems.Add(wY) nella colonna 9
item.SubItems.Add(wM) nella colonna 10
item.SubItems.Add(wD) nella colonna 11

oppure

li vorrei inserire magari esempio:
item.SubItems.Add(wY) nella colonna 12
item.SubItems.Add(wM) nella colonna 13
item.SubItems.Add(wD) nella colonna 14

e così via

Spero sia più chiaro
ciao


Mau67

Jeremy Profilo | Guru

Ciao.
Forse ho capito .... una cosa così può andar bene????

Dim a As New ListViewItem("Prova") a.SubItems.Add(New ListViewItem.ListViewSubItem) a.SubItems.Add(New ListViewItem.ListViewSubItem) a.SubItems.Add(New ListViewItem.ListViewSubItem) a.SubItems.Add("Prova") ListView1.Items.Add(a)

o più semplicemente:
Dim a As New ListViewItem("Prova") a.SubItems.Add(String.Empty) a.SubItems.Add(String.Empty) a.SubItems.Add(String.Empty) a.SubItems.Add("Prova") ListView1.Items.Add(a)

Altrimenti ....scusa ma continuo a non capire io.

Facci sapere...
Ciao

Mau67 Profilo | Expert

Il codice potrebbe andare bene, ma dove lo inserisco? come assegno le colonne?

Guarda l'esempio allegato il nr. 1074 e se noti bene ho riprodotto la ListView e i dati che ho inserito dovrebbero fare capire cosa voglio e cioe colonna 0 ID colonna 1 TipoOp colonna 2 Reparto colonna 3 Dal colonna 4 Al ecco queste colonne sono inserite dalla Select

adesso se osservi sempre l'esempio la Prima e la terza riga ha come TipoOp il codice "NU" e se osservi il risultato della datediff mette gli anni nella colonna 5 , mesi nella colonna 6 e giorni nella colonna 7.

Invece nella seconda riga ha come TipoOp il codice "CA" e il risultato della datediff mette gli anni nella colonna 11 , mesi nella colonna 12 e giorni nella colonna 13.

ecco quello che voglio e che se TipoOp è uguale a "NU" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 5, 6 e 7.
se il TipoOp è uguale a "UM" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 8, 9 e 10.
se il TipoOp è uguale a "CA" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 11, 12 e 13.

e così via

chiaramente le colonne dallo 0 al 4 li carica sempre dalla listview .

Hai tutto il codice che uso per il mio form quindi se adesso ti è più chiaro modifica quello per farmi capire dove inserire il codice giusto

Grazie



Mau67

Jeremy Profilo | Guru

Ciao.
Il codice che ti ho suggerito, è un esempio per farti capire come fare a lasciare vuote delle celle per popolare le successive.

Ad ogni modo ..... avrei bisogno di capire ancora una cosa ...... escluse le prime 5 colonne, che vengono popolate dal datareader, in base a quale criterio decidi quali colonne lasciare vuote e quali popolarle con giorni, mesi ed anni???
Provo a spiegarmi meglio ..... tu hai 31 colonne, in base a quale criterio decidi di scrivere giorni mesi ed anni nelle colonne 9-10-11 piuttosto che 12-13-14.

Facci sapere...
Ciao

Mau67 Profilo | Expert

In base al criterio TipoOp

se TipoOp è uguale a "NU" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 5, 6 e 7.
se il TipoOp è uguale a "UM" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 8, 9 e 10.
se il TipoOp è uguale a "CA" il risultato della date diff deve incolonnare tutti i risultati nelle colonne 11, 12 e 13.



Mau67

Jeremy Profilo | Guru

Ciao.
Questo è il codice:

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) 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) ''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 ''================================================= '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) '-------------------------------- '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) '-------------------------------- '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 ListView1.Items.Add(item) ''<------QUESTO L'HO SPOSTATO IO End While

Prova a vedere se è quello che ti serve.
Mi sono permesso di fare anche qualche aggiustamento sulla tipizzazione delle variabili e sulla conversioni di tipi (vedi Date.Parse).
Ti consiglio, per le prossime volte, di impostare OptionStrict On in modo da evitare conversioni implicite e di conseguenze possibili errori a run time.

Facci sapere...
Ciao

Mau67 Profilo | Expert

OTTIMO!!!!!!!!!!!!!!!!!! esattamente quello che mi serviva

Grazie infinite non mi resta che accettare e salutarti ulterioremnte

CIAO alla prossima
Mau67
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