Ciclo for su di una listview.

lunedì 19 maggio 2014 - 12.28
Tag Elenco Tags  VB.NET

leviathan89 Profilo | Newbie

Salve, sto creando un programma, ho una list view e due textbox.
Premendo il pulsante il programma mi inserisce il valore della textbox 1 sulla colonna 1 per il valore che inserisco nell'inpitbox, invece per quando riguarda la seconda colonna me lo inserisce solo una volta, come mai? Dove sbaglio?
Vi lascio il codice:


Public Class Form1
Dim fine As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
fine = InputBox("inserisci numero rate autorizzate!")
For i = 1 To fine
ListView1.Items.Add(TextBox1.Text)
ListView1.Items.Item(0).SubItems.Add(TextBox2.Text )
Next
End Sub
End Class

AntCiar Profilo | Expert

Ciao.

E' sbagliato il modo di creare il listviewitem


tu hai scritto questo codice nel tuo ciclo for:

ListView1.Items.Add(TextBox1.Text)
ListView1.Items.Item(0).SubItems.Add(TextBox2.Text )

La prima riga ti crea un nuovo listViewItem e ci piazza nella prima colonna il valore di TexBox1.
la seconda riga aggiunge sempre all'item di posizione 0 (ovvero il primo) un subitem con il valore di TextBox2

In pratica se aggiungeresti altre colonne alla listview vedresti sul primo item il valore della textbox2 replicato per ogni colonna.

Puoi risolvere in questi 2 modi: (il codice che posto lo devi sostituire al posto delle due righe che ho citato)

1:

dim elem as listviewitem = new listviewitem(TextBox1.Text)
elem.SubItems.Add(TextBox2.Text )
ListView1.Items.add(elem)

2:

ListView1.Items.Add(TextBox1.Text)
ListView1.Items.Item(ListView1.Items.count-1).SubItems.Add(TextBox2.Text )



Con il primo scrivi una riga in più ma sei sicuro di aggiornare il valore esatto.




Cristian Barca

leviathan89 Profilo | Newbie

A volte ci si perde in un bicchiere d'acqua; ultimo aiutino, se puoi darmelo.
Ho nella listview un datetimepicker, so come aggiungerlo ma vorrei che in ogni riga mi aumentasse di un mese, sai come posso farlo? Ti rinigrazio anticipamente!

AntCiar Profilo | Expert

Per aggiungere un mese in più alla data puoi usare il metodo AddMonth del tipo Date.

Ad esempio integrando il codice di ieri:


Date dtStart = date.today
in dtStart ho messo la data di sistema poi tu sai quale è quella corretta

for..
Dim elem as ListViewItem = new ListViewItem(me.textBox1.text)
elem.SubItems.Add(me.textBox2.text)

elem.SubItems.Add(dtStart.date)

dtStart = dtStart.AddMonth(1)

next
Cristian Barca

leviathan89 Profilo | Newbie

Ti ringrazio, poi testo e ti faccio sapere. Comunque ho usato questa riga di codice:

ListView1.Items.Add(TextBox1.Text)
ListView1.Items.Item(ListView1.Items.count-1).SubItems.Add(TextBox2.Text )

La prima che mi hai dato mi va in errore.

Ti ringrazio! Spero di non avere più problemi :P

leviathan89 Profilo | Newbie

Io ho questo codice sul pulsante reateizza, dove va inserito che mi da errore? Non capisco scusami.


Private Sub rateizza_Click(sender As Object, e As EventArgs) Handles rateizza.Click fine = rateautorizzate.Text For i = 1 To fine ListView1.Items.Add(rateautorizzate.Text) ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(dtStart.Text) ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(Label15.Text) ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(Label18.Text) ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(Label19.Text) ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(Label21.Text) Next End Sub

AntCiar Profilo | Expert

Ciao

con il codice che hai messo non si capisce bene da dove vai a prendere la data di partenza a cui aggiungere i mesi.
Ora se la tua data di partenza è una DateTimePicker oppure un oggetto Date non hai problemi.
Se invece scrivi la data in una textBox (che penso essere quello che fai visto che nell'evento hai indicato dtStart.Text), allora ti devi creare un oggetto Date e fare il cast del contenuto della textbox nel tipo Date.

Mi occorrono informazioni più chiare circa il modo in cui immetti la data.

Cristian Barca

leviathan89 Profilo | Newbie

Hai ragione, ti ho confuso un pò le idee. Torniamo al codice di prima: Ho 3 TextBox e un datetimepicker.

Due Textbox devono ripetersi all'interno della listview quante volte scrivo il valore nell'inputbox. E fin qui tutto bene.
La terza textbox deve ripetersi una volta sola. (devo fare un altro for?)
Il datetimepicker deve aumentare ogni volta, sempre dal valore preso dall'inputbox.
Ti lascio il codice precedente:

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

Spero di essere stato più chiaro e in un tuo aiuto. Ti ringrazio anticipamente.

AntCiar Profilo | Expert

Ok.

Ultima domanda: nel codice hai commentato un subItems con 'questa deve ripetersi una volta sola'. Intendi dire che il valore di TextBox2 deve comparire solo nel primo elemento e gli altri n -1 devono essere vuoti?

se è così questo è il codice (compreso della parte di gestione della data) altrimenti dimmi come deve essere:


fine = InputBox("Inserisci numero rate autorizzate.")

Dim tmp as Date = Me.Datetimepicker1.Value.Date
(non ho VS ora e quindi scrivo direttamete. Ora non ricordo se è 'Me.Datetimepicker1.Value.Date' oppure 'Me.Datetimepicker1.Date')

For i = 1 To fine
ListView1.Items.Add(TextBox1.Text) ' questa deve ripetersi quante volte ho scritto nell'inputbox

ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(iif(i=0, TextBox2.Text, "")) ' questa deve ripetersi una volta sola

ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(TextBox3.Text) ' questa deve ripetersi quante volte ho scritto nell'inputbox
ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(tmp.ToShortDateString()) ' deve aumentare di mese quante volte ho scritto nell'inputbox
tmp=tmp.AddMonth(1)
Next


Cristian Barca

leviathan89 Profilo | Newbie

Ti ringrazio, tutto alla perfezione.

leviathan89 Profilo | Newbie

E se volessi mettere i numeri da 1 al valore inserito nell'inputbox?Sempre nella listview?

AntCiar Profilo | Expert

Ciao.

La cosa è semplicissima.

ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(i.Tostring())




Cristian Barca

leviathan89 Profilo | Newbie

Perfetto! Ti ringrazio tanto, una domanda. Come mai molte volte una volta compilato il programma, inserendo i dati nelle textbox, dopo aver fatto i relativi calcoli, a volte non mi riporta i dati nella listview. Invece una volta chiusa e riaperta non me lo fa più.

leviathan89 Profilo | Newbie

Perfetto! Ti ringrazio tanto, una domanda. Come mai molte volte una volta compilato il programma, inserendo i dati nelle textbox, dopo aver fatto i relativi calcoli, a volte non mi riporta i dati nella listview. Invece una volta chiusa e riaperta non me lo fa più.

AntCiar Profilo | Expert

Beh detta così è un po difficile capire il problema.

Dovresti vedere il popolamento della listview da chi viene chiamato e quando viene chiamato. Molte volte potrebbe essere dovuto ad un errore logico di progettazione. Tu che hai realizzato la form sai benissimo in che modo "compilarla" (a livello di dati intendo) e in che ordine e quindi nei vari test esegui quasi serialmente le stesse operazioni e magari non hai contemplato qualche caso che alla fine ti solleva il problema.


Comunque se vuoi manda il codice della form con qualche spiegazione e vediamo di capire il problema.


Cristian Barca

leviathan89 Profilo | Newbie

Ti lascio il codice, ho 2 bottoni nel programma. Sono solo calcoli su textbox e label. Ti ho commentato la riga dove a volte mi lascia il campo vuoto.

1) primo bottone che calcola.

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

2) secondo bottone rateizza.

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

AntCiar Profilo | Expert

Ciao.

Ho dato una occhiata al codice. Prima di vedere nello specifico ho visto che hai usato TextBox per immissione di numeri. Ti sconsiglio vivamente di utilizzare le textbox. queste sono fatte per il testo, nulla ti vieta di di usarle perchè alla fine 100 è anche un testo ma le probabilità di errore aumentano di brutto. Esistono a tale proposito i numericUpDown che permettono l'inserimento di soli numeri (interi, decimali, formattati con N cifre etc) e non devi preoccuparti di fare conversioni.

Il problema di fare Convert.ToDouble(textbox.text) può essere:
1 - nella textbox ci sta uno spazio ---> errore
2 - nella textbox ci sta un carattere non numerico ---> errore
3 - Nella textbox scrivi il numero decimale 10,5 con la virgola e non con il punto. ---> per la CultureInfo italiana questo ti risulta come 105 (se cambi culture tipo la Inglese en-gb lo stesso numero se lo scrivi con la virgola funziona, con il punto ti da 105)


Ritornando al tuo codice:

If sanzione.Text = "" And speseadd.Text = "" And rateautorizzate.Text = "" Then
MsgBox("Campi vuoti, impossibile proseguire!", vbInformation)
End If

Questo non è detto che funzioni correttamente perchè se in una delle tre c'è uno spazio e nelle altre dei valori, il codice continua.

Il problema sicuramente sta in una delle conversioni da stringa a double.

Se puoi riconverti il tuo codice così elimini un 70% dei tuoi problemi.
Cristian Barca

AntCiar Profilo | Expert

riguardando il codice, puoi sicuramente mettere la parte di calcolo nel else dell'IF di controllo altrimenti dai il messaggio che devono mettere i valori e poi comunque il calcolo lo fai fare lo stesso.

If sanzione.Text = "" And speseadd.Text = "" And rateautorizzate.Text = "" Then
MsgBox("Campi vuoti, impossibile proseguire!", vbInformation)
else
totaleinteressi.Text = ((Val(sanzione.Text) * Val(interessi.Text).ToString("0.00") / 100) / 12).ToString("0.00") * Val(rateautorizzate.Text).ToString("0.00")
nettomensile.Text = (Convert.ToDouble(sanzione.Text) / Convert.ToDouble(rateautorizzate.Text)).ToString("0.00")
interessemensile.Text = (Convert.ToDouble(totaleinteressi.Text) / Convert.ToDouble(rateautorizzate.Text)).ToString("0.00")
ratamensile.Text = (Convert.ToDouble(nettomensile.Text) + Convert.ToDouble(interessemensile.Text)).ToString("0.00")
Label20.Text = (Convert.ToDouble(ratamensile.Text) * Convert.ToDouble(rateautorizzate.Text)).ToString("0.00")
totaleversare.Text = (Convert.ToDouble(Label20.Text) + Convert.ToDouble(speseadd.Text)).ToString("0.00")
speserata.Text = speseadd.Text
rmensile.Text = (Convert.ToDouble(nettomensile.Text) + Convert.ToDouble(interessemensile.Text)).ToString("0.00") 'calcolo che a volte mi lascia vuoto
rataspese.Text = (Convert.ToDouble(ratamensile.Text) + Convert.ToDouble(speserata.Text)).ToString("0.00") 'calcolo che a volte mi lascia vuoto
sspese.Text = speseadd.Text
If Val(nettomensile.Text) < 105.0 Then
MsgBox("Importo minima rata 105.00€ aumentare numero rate!", vbCritical)
End If
totaleversare.Text = "€" & Format(totaleversare.Text)
nettomensile.Text = "€" & Format(nettomensile.Text)
interessemensile.Text = "€" & Format(interessemensile.Text)
ratamensile.Text = "€" & Format(ratamensile.Text)
Label20.Text = "€" & Format(Label20.Text)
speserata.Text = "€" & Format(speserata.Text)
ListView1.Items.Clear()
end if
Cristian Barca

leviathan89 Profilo | Newbie

Scusami se rispondo in ritardo ma ero impegnato in questi giorni, ti ringrazio tutto corretto e rivisitato. Ho scoperto perchè mi lasciava l'item bianca sulla listview, invece di premere sul pulsante premevo invio; adesso ho risolto.
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5