Ricalcolare dati listview

mercoledì 22 agosto 2012 - 22.14
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Visual Studio 2008  |  MySQL 5.5

Mau67 Profilo | Expert

Ciao forum,
nella mia listview inserisco alcuni dati questo è il codice:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim ValoreMedio As Double = CDec(TextBox7.Text)
Dim RitenutaTesoro As Double = (CDec(TextBox7.Text) * CDec(TextBox8.Text)) / 100
Dim FondoCredito As Double = (CDec(TextBox7.Text) * CDec(TextBox9.Text)) / 100
Dim Imponibile As Double = (ValoreMedio - FondoCredito - RitenutaTesoro)
Dim Irpef As Double = (Imponibile * CDec(TextBox10.Text)) / 100
Dim NettoMano As Double = Imponibile - Irpef

Dim lSingleItem As ListViewItem

lSingleItem = ListView1.Items.Add(Label9.Text, 0) 'ID
lSingleItem.SubItems.Add(TextBox11.Text) 'Nominativo
lSingleItem.SubItems.Add(CDec(TextBox7.Text)) 'Valore Medio
lSingleItem.SubItems.Add(CDec(TextBox12.Text)) 'Coefficente
lSingleItem.SubItems.Add(Format(CDec(TextBox8.Text), "###,##0.00")) ' Ritenuta tesoro %
lSingleItem.SubItems.Add(Format(CDec(RitenutaTesoro), "###,##0.00")) ' Ritenuta tesoro Valore
lSingleItem.SubItems.Add(Format(CDec(TextBox9.Text), "###,##0.00")) ' Fondo Credito %
lSingleItem.SubItems.Add(Format(CDec(FondoCredito), "###,##0.00")) ' Fondo Credito Valore
lSingleItem.SubItems.Add(Format(CDec(TextBox10.Text), "###,##0.00")) ' Irpef %
lSingleItem.SubItems.Add(Format(CDec(Irpef), "###,##0.00")) ' Irpef valore
lSingleItem.SubItems.Add(Format(CDec(Imponibile), "###,##0.00")) ' Imponibile valore
lSingleItem.SubItems.Add(Format(CDec(NettoMano), "###,##0.00")) ' Netto Mano

End Sub

adesso in un altro button vorrei inserire il codice per ricalcolare i dati e cioè se cambia il valore nella textbox7.text
senza dover riinserire tutti i record nella listview vorrei che con la pressione di un button mi ricalcolasse tutto
come posso fare grazie

Mau67

alextyx Profilo | Expert

Buongiorno Mau :)
Io farei una procedura che inserisce un tot di subitem, volendo anche vuoti, per ogni item aggiunto e la chiamerei solo una volta. Subito dopo chiamerei la procedura che calcola i valori e gli inserisce (modificando la proprietà text) nei subitem opportuni. Così facendo puoi ricalcolare i valori semplicemente richiamando la detta procedura, che NON aggiungerà subitem, ma ne modificherà solo il contenuto

Mau67 Profilo | Expert

Buongiorno
grazie della risposta ma non saprei come fare è possibile qualche riga di codice te ne sarei grato, stò imparando.
Grazie della disponibilità
Mau67

alextyx Profilo | Expert

Ad esempio, per aggiungere tanti subitems quante sono le colonne del listview, ad un nuovo item che stai creando:

Dim It As New ListViewItem
For i As Integer = 0 To Me.LsoPrenotazioni.Columns.Count - 1
It.SubItems.Add("")
Next

Poi, potresti riempire i subitems con dei valori, semplicemente facendo riferimento al loro indice. Tra l'altro, io trovo molto utile usare, al posto dell'indice numerico, che devo ricordarmi ogni volta che scrivo una riga di codice, ricontrollando quali sono le colonne del listview e la loro posizione, una enumerazione, che mi restituisce un intero, ma che io scrivo come uno mnemonico e, tra l'altro, suggerito dall'intellisense. Es.:

It.SubItems(EnuLsoPrenotazioniSelezionate.IDPrenotazione).Text = D.GetInt32(EnuTabPrenotazioni.IDPrenotazioneInt).ToString()
It.SubItems(EnuLsoPrenotazioniSelezionate.Inizio).Text = D.GetDateTime(EnuTabPrenotazioni.InizioPeriodo).ToShortDateString
It.SubItems(EnuLsoPrenotazioniSelezionate.Fine).Text = D.GetDateTime(EnuTabPrenotazioni.FinePeriodo).ToShortDateString

Nelle righe sopra, leggo un datareader (D), ma potrei utilizzare il contenuto delle textbox.

L'enumerazione che sto richiamando in quelle righe, è la seguente:

Private Enum EnuLsoPrenotazioniSelezionate As Integer

IDPrenotazione = 0
Inizio = 1
Fine = 2
Contatto = 3
Circuito = 4
CompletamenteAssociata = 5
IDContatto = 6

End Enum

Come noterai, a destra dell'uguale, dove leggo il datareader, utilizzo, con la stessa logica, una enumerazione che ho creato per accedere ai campi di una tabella del DB. Usando l'enumerazione, oltre ai vantaggi immediatamente percepibili di avere uno mnemonico al posto di un numero (un po' come il DNS sul WEB), avrai anche quello che, se dovessi cambiare l'ordine delle colonne, o anche aggiungerne alcune nel mezzo, basterà riaggiornare l'enum e ricompilare il progetto e tutto tornerà a posto, altrimenti dovrai andare a ricercare ogni assegnazione e cambiare l'indice del subitem. Questo problema, lo avresti anche col tuo metodo di inserzione diretta, perchè se dovessi cambiare l'ordine delle colonne, dovresti andare a rincorrere nel codice tutti i punti dove lavori sul listview. Usando la enum e popolando un item con tutti i subitems necessari, come ti suggerisco, eviterai elegantemente il problema.

Mau67 Profilo | Expert

Grazie della risposta scusami ma non riesco a mettere insieme i pezzi,
con il codice che ti ho scritto sopra potresti cortesemente riconfigurarlo con quello che hai scritto tu? perfavore
provo e riprovo ma non funziona
Scusami ancora grazie
Mau67

alextyx Profilo | Expert

"provo e riprovo ma non funziona"
Fammi vedere quello che hai scritto, vediamo se riesco a vedere dove manca qualcosa o dove non ci siamo capiti.
Per darti io del codice, dal momento che non mi piace dare codice non funzionante, dovrei crearmi il listview, le textbox, ecc... per testare il tutto e ora non potrei farlo.
Oppure, lascia perdere le enumerazioni e limitati alla sola prima parte del suggerimento. Andiamo per gradi ;)

Mau67 Profilo | Expert

Ho fatto cosi:

Private Enum EnuLsoPrenotazioniSelezionate As Integer
ID = 0
Nominativo = 1
Valore_Medio = 2
End Enum

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim It As New ListViewItem
For i As Integer = 0 To Me.ListView1.Columns.Count - 1
It.SubItems(EnuLsoPrenotazioniSelezionate.ID).Text = Label9.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Nominativo).Text = TextBox11.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Valore_Medio).Text = CDec(TextBox7.Text)
Next

End Sub
Mau67

alextyx Profilo | Expert

"Ho fatto cosi:

Private Enum EnuLsoPrenotazioniSelezionate As Integer
ID = 0
Nominativo = 1
Valore_Medio = 2
End Enum

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim It As New ListViewItem
For i As Integer = 0 To Me.ListView1.Columns.Count - 1
It.SubItems(EnuLsoPrenotazioniSelezionate.ID).Text = Label9.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Nominativo).Text = TextBox11.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Valore_Medio).Text = CDec(TextBox7.Text)
Next

End Sub"

Allora, la enum ce l'abbiamo, ma non abbiamo separato la creazione dei subitems dalla loro valorizzazione, anzi mi pare che non siano più neppure creati.

Non so quanti item tu abbia nel tuo listview, o comunque se tu sappia con esattezza con quale numero identificare l'indice del tuo item (riga). Oppure potresti cliccare su un certo item per selezionarlo e poi aggiornare quello specifico item. Diciamo comunque che tu abbia da mettere i tuoi valori in un listview con una sola riga ( item(0) )

Partiamo dall'inizio, cioè da quando ancora non hai aggiunto alcun item al tuo listview, ad esempio nella load del form e diciamo che il tuo listview si chiami l1 (che è breve )

Dovrai usare il codice che ti ho proposto:

Dim It As New ListViewItem
For i As Integer = 0 To Me.l1.Columns.Count - 1
It.SubItems.Add(i.tostring) 'così dovresti vedere le varie celle riempite con numeri crescenti e verifichiamo che siamo riusciti a creare un item con un certo numero di subitems valorizzati
Next

Poi aggiungere lo item, che supponiamo per adesso sia l'unico, al tuo listview l1

Me.l1.items.add(it)

Occhio perchè scrivo a memoria, non ho la IDE aperta e potrei scrivere castronerie piuttosto severe in termini sintattici e non solo.

Ora diciamo che abbiamo messo questo codice nell'evento form del load
Adesso la procedura di gestione dell'evento load, che eventualmente conterrà anche il codice che serve a te per altri scopi, è terminata e torniamo alla gestione dell'evento click del button3, come proponevi:


Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim it As ListViewItem = me.l1.items(0)

It.SubItems(EnuLsoPrenotazioniSelezionate.ID).Text = Label9.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Nominativo).Text = TextBox11.Text
It.SubItems(EnuLsoPrenotazioniSelezionate.Valore_Medio).Text = CDec(TextBox7.Text)

End Sub

A occhio dovrebbe funzionare, ma, come ti ripeto, scrivere il codice a mano e non provarlo porta a fare figure cacinissime

Mau67 Profilo | Expert

Questo lo messo nel load
Dim It As New ListViewItem
For i As Integer = 0 To Me.l1.Columns.Count - 1
Me.l1.Items.Add(It)
It.SubItems.Add(i.ToString)

Next
<<<<<<QUI non carica niente>>>>

questo nel button
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim it As ListViewItem = Me.l1.Items(0) <<<<QUI GENERA ERRORE>>>> InvalidArgument=Valore di '0' non valido per 'index'. Nome parametro: index
it.SubItems(EnuLsoPrenotazioniSelezionate.ID).Text = Label9.Text
it.SubItems(EnuLsoPrenotazioniSelezionate.Nominativo).Text = TextBox11.Text
it.SubItems(EnuLsoPrenotazioniSelezionate.Valore_Medio).Text = CDec(TextBox7.Text)
End Sub


Mau67

alextyx Profilo | Expert

Ti sei perso un pezzettino del mio post. Sempre nell'evento load, dopo che hai creato i subitems per lo item it, devi aggiungere l'oggetto item it alla collezione, attualmente vuota, di item del listview l1:

"
........
Poi aggiungere lo item, che supponiamo per adesso sia l'unico, al tuo listview l1

Me.l1.items.add(it)
.........
"

Mau67 Profilo | Expert

Evento Load

Dim It As New ListViewItem
For i As Integer = 0 To Me.l1.Columns.Count - 1
It.SubItems.Add(i.ToString)
It.SubItems.Add(i.ToString)
It.SubItems.Add(i.ToString)
It.SubItems.Add(i.ToString)
Exit For
Next
Me.l1.Items.Add(It)
<<<<<<NON VEDO CAMBIAMENTI>>>>>>>>>>
Button

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim it As ListViewItem = Me.l1.Items(0)
it.SubItems(EnuLsoPrenotazioniSelezionate.ID).Text = Label9.Text
it.SubItems(EnuLsoPrenotazioniSelezionate.Nominativo).Text = TextBox11.Text <<<<ERRORE ADESSO E' QUI>>>> InvalidArgument=Valore di '1' non valido per 'index'. Nome parametro: index
it.SubItems(EnuLsoPrenotazioniSelezionate.Valore_Medio).Text = CDec(TextBox7.Text)
End Sub


Mau67

Mau67 Profilo | Expert

Ho trovato la soluzione eccola

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
For Each Item As ListViewItem In ListView1.Items
Dim ValoreMedio As Double = CDec(TextBox7.Text)
Dim Coefficente As Double = CDec(Item.SubItems(3).Text)
Dim Quota As Double = ValoreMedio * Coefficente
Dim RitenutaTesoro As Double = (CDec(Quota) * CDec(TextBox8.Text)) / 100
Dim FondoCredito As Double = (CDec(Quota) * CDec(TextBox9.Text)) / 100
Dim Imponibile As Double = (Quota - FondoCredito - RitenutaTesoro)
Dim Irpef As Double = (Imponibile * CDec(TextBox10.Text)) / 100
Dim NettoMano As Double = Imponibile - Irpef

'Ottiene i valori da ogni elemento
Item.SubItems(2).Text = ValoreMedio
Item.SubItems(3).Text = Coefficente
Item.SubItems(4).Text = Quota
Item.SubItems(6).Text = RitenutaTesoro
Item.SubItems(8).Text = FondoCredito
Item.SubItems(9).Text = Imponibile
Item.SubItems(11).Text = Irpef
Item.SubItems(12).Text = NettoMano
Next
End Sub

Ciao grazie alla prossima
Mau67

alextyx Profilo | Expert

Ciao Mau. Purtroppo ora sono io che non capisco cosa stia accadendo al tuo listview, nè perchè non inizializzasse i subitems e neppure perchè vuoi fare quella operazione per ogni item del listview, ma non importa. Purtroppo il codice bisognerebbe provarlo su un progetto reale e non avendo avuto il tempo per farlo non mi rendo conto di quello che accade seguendo la falsariga di quanto ti proponevo.
Buon lavoro, comunque :)
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5