Italian estrapolare il prezzo da una riga della listview e portarli in una edittext

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao, Come da titolo vorrei capire come poter estrapolare il valore di un prezzo inserito su una listview, supponiamo di avere una edittext ed una listview con dei dati inseriti e alla fine il costo in euro.
esempio: sulla prima riga della listview abbiamo: 3 kg di pasta - Euro 3.50
sulla seconda riga: una bottiglia di vino - Euro 5.00
sulla terza riga: Formaggio stagionato - Euro 4.50 e così via...
tutte queste informazioni sono inserite in una listview ed i loro prezzi sommati ed inseriti in modo automatico in una edittext che fa da somma totale,
io vorrei che se rimuovo uno di questi elementi dalla listview ad esempio: una bottiglia di vino - Euro 5.00
questa dovrebbe essere tolta dal totale della somma della edittext.
quindi se tutte e tre i prodotti sono in totale Euro 13.00 togliendo la bottiglia di vino dovremmo visualizzare il nuovo totale - la bottiglia e cioè Euro 8.00.
spero di essere stato comprensibile e che qualcuno possa aiutarmi a questo enigma.
 

LucaMs

Expert
Licensed User
Longtime User
Ma se fai già il totale, evidentemente riesci già a ricavare da ogni riga della ListView i valori; quindi nello stesso modo, nell'evento ItemLongClick, tramite il parametro Value, ottieni la cifra da togliere al totale e poi elimini l'elemento dalla ListView usando NomeTuaListView.RemoveAt(Position) (previa conferma dell'utente tramite msgbox).
 

LucaMs

Expert
Licensed User
Longtime User
No, probabilmente calcoli il totale mentre riempi la ListView.

Allora puoi fare in questo modo, se il testo inserito è come nei tuoi esempi:

B4X:
Sub ListView1_ItemLongClick (Position As Int, Value As Object)
   If Msgbox2(Value, "Confermi l'eliminazione di", "Sì", "Annulla", "No", Null) = DialogResponse.POSITIVE Then
     Dim Elemento As String = Value
     Dim Parole() As String = Regex.Split("Euro", Elemento)
     Dim Prezzo As Float = Parole(Parole.Length - 1)
     mTotale = mTotale - Prezzo
     ListView1.RemoveAt(Position)
   End If
End Sub
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora, funziona alla grande il tuo codice, solo un piccolo problema, non scorpora dal totale la somma giusta,fino a quando sono pezzi singoli funziona tutto, appena scelgo di rimuovere ad esempio 6 scatole di tonno ..........
allora mi rimuove sotanto il quantitavo, questo il codice che sto usando
B4X:
If Msgbox2(Value, "Confermi l'eliminazione di", "Sì", "Annulla", "No", Null) = DialogResponse.POSITIVE Then
                Dim Elemento As String = Value
                Dim Parole() As String = Regex.Split("Euro", Elemento)
                Dim Prezzo As Float = Parole(Parole.Length - 1)
                txttotaleeuro.Text = txttotaleeuro.Text - Prezzo
                lswordine.RemoveAt(Position)
                txteuro.Text=0
            End If
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Praticamente se nella listview c'è scritto: 1 : Scatola di Tonno - Euro 2.50
allora fa lo scorporamento esatto,
se invece nella listview c'e scritto: 6 Scatole di tonno - Euro 15.00
da quest'ultima ne scorpora solo una unità singola e ciòe: Euro 2.50
quindi nella txttotaleeuro.text non rimuove tutta la somma delle 6 scatole di tonno,
per il quantitativo uso uno spinner chiamato: spquantità.selcteditem dentro questo spinner ci sono inseriti le quantità che vanno da 1 a 200
quindi prima di scrivere dentro la listview, scelgo la quantità dallo spinner se questi è più di uno oppure in automatico faccio apparire sulla listview il numero 1:
in modo da sapere che questa è soltanto un pezzo singolo.
Poi dagli altri 7 spinner dove sono inseriti i vari prodotti, seleziono il prodotto interessato con l'importo già in euro e lo inserisco dentro la listview.
 
D

Deleted member 103

Guest
Scusa Filippo, ma se nella Listview c'é schritto 15 Euro(Value = 15), perchè diminuisce il totale solo di 2,50 Euro ?
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Filippo nn lo so perchè scorpora solo di un pezzo al posto dei 6 pezzi,
comunque sulla listview ogni volta che si inserisce un prodotto scrive sempre in questo modo ( 1: Scatola di Tonno - Euro 2.50 )
se invece sono più scatole ad esempio 6 scrive così ( 6: Scatole di Tonno - Euro 2.50 )
quindi dovrei riuscire a capire come estrapolare il valore 6 e fare in modo che scorpori per 6 pezzi e non per 1 pezzo )
però attenzione !!! al posto del valore 6 può essereci anche ad esempio 50 oppure 120, come vedi sono 1 cifra 2 cifre oppure 3 cifre di numeri
quindi deve riuscire a scorporare l'esatto valore inserito sulla listview.
 

LucaMs

Expert
Licensed User
Longtime User
Praticamente se nella listview c'è scritto: 1 : Scatola di Tonno - Euro 2.50
allora fa lo scorporamento esatto,
se invece nella listview c'e scritto: 6 Scatole di tonno - Euro 15.00
da quest'ultima ne scorpora solo una unità singola e ciòe: Euro 2.50

Devi riuscire ad estrapolare il prezzo e la quantità, per poter fare il calcolo, ovviamente.

Se il testo ha una "struttura" ben definita, puoi farlo con le SubStr2 o, come ho fatto io nell'esempio, con Regex.Split.
Quest'ultima, suddivide il testo in base ad un "separatore" (testo) che tu gli passi; ad esempio, metti che io abbia una stringa:

MiaStringa = "ciao:ho comprato:10"

puoi suddivere il testo in parole sfuttando i due punti come separatore:

Dim Parole() As String = Regex.Split(":", MiaStringa).


Spiegato il fatto, sta a te dare una forma al testo in modo che sia possibile recuperare le singole parti.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
ragazzi dove sbaglio? vorrei poter estrapolare il numero inziale ma mi da 0
questo il codice:
B4X:
Sub ListView1_ItemClick (Position As Int, Value As Object)
    Dim i As Int
    i = txttotaleeuro.Text.IndexOf("|")
    If i >= 0 Then
        txteuro.Text = txttotaleeuro.Text.SubString2(i + 1, txttotaleeuro.Text.Length)
    End If
         
                                 
                ListView1.RemoveAt(Position)
                txteuro.Text=0
         
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Intanto dovresti prendere ciò che c'è scritto nella ListView, quindi il parametro Value e non txttotaleeuro.Text.

Poi, se Value, ovvero ciò che l'utente ha clickato, contiene come separatore il Pipe ("|"), essendo questo un carattere speciale devi precederlo dal backslash...

Insomma, dovrebbe essere:

i = Value.IndexOf("\|").

Ma puoi usare lo stesso simbolo anche con Regex.Split("\|", Value), come ti ho spiegato in un post precedente.

Ma c'è quel carattere nel testo? Non credo. Comunque, metti un break poin sulla Sub, manda in esecuzione il programma in modo Debug, premi F8 per eseguire una riga per volta e guarda che succede (leggi i valori passando il cursore sulle variabili).

Inoltre, se il numero è all'inizio della stringa, usando come secondo parametro di SubString2 la lunghezza del testo (che ripeto deve essere Value) prelevi dalla posizione i+1 fino alla fine.
 
D

Deleted member 103

Guest
Io ti consiglio di usare questo modo, penso che ti renda la vita più facile.
Nel momento in cui riempi la Listview dovresti sapere il prezzo totale, quindi lo puoi inserire, il mio è solo un esempio.
B4X:
Sub Process_Globals
    Type lvItem(testo As String, prezzo As Double)
    Private totale As Double
End Sub

Sub Globals
    Dim ListView1 As ListView
    Dim txttotaleeuro As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout1")

    Dim testo(5) As String
    testo(0) = "1 pizza 5,0 Euro"
    testo(1) = "2 pizza 5,0 Euro"
    testo(2) = "1 bibita 2,0 Euro"
    testo(3) = "2 pizza 2,0 Euro"
    testo(4) = "5 pizza 5,0 Euro"
   
    Dim prezzo(5) As Double
    prezzo(0) = 5
    prezzo(1) = 10
    prezzo(2) = 2
    prezzo(3) = 4
    prezzo(4) = 25

    For i = 0 To testo.Length -1
        Dim item As lvItem
        item.Initialize
        item.testo = testo(i)
        item.prezzo = prezzo(i)
       
        totale = totale + prezzo(i)
       
        ListView1.AddSingleLine2(testo(i), item)

    Next
End Sub

Private Sub ListView1_ItemLongClick (Position As Int, Value As Object)
    Dim Elemento As lvItem = Value

    If Msgbox2(Elemento.testo, "Confermi l'eliminazione di", "Sì", "Annulla", "No", Null) = DialogResponse.POSITIVE Then
       
        totale = totale - Elemento.prezzo
        txttotaleeuro.Text = totale & " Euro"
        ListView1.RemoveAt(Position)

    End If
End Sub
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Filippo il tuo codice così com'è funziona, ma non riesco ad implementarlo sul mio progetto a causa delle diversità che ci sono, io uso una listview già compilata dove devo estrapolare il quantitativo, magari sono io che non riesco ad implementarla ma ci sono delle differenze notevoli sulll'utilizzo dei codici.
 
D

Deleted member 103

Guest
Se posti il codice con il quale compili la Listview, forse ti posso dare una mano.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Sono riuscito a ricavare dalla listview il quantitativo che volevo con questo codice:
B4X:
Sub spm6_ItemClick (Position As Int, Value As Object)
   mp1.Initialize
   mp1.Load(File.DirAssets,"clickok.mp3")
   mp1.Play
   txtmn6.Text = (spquantita.SelectedItem & " : " & spm6.SelectedItem)
   lswordine.AddSingleLine  ( txtmn6.Text )
   Dim i As Int
   i = txtmn6.Text.IndexOf("Euro")' eseguo la ricerca di Euro per poter estrapolare solo la cifra da inserire nella txteuro.text
   If i >= 0 Then
     txteuro.Text = txtmn6.Text.SubString2(i + 4, txtmn6.Text.Length)' da qui estrapolo l'importo in euro
     txteuro.Text =  (txteuro.Text * spquantita.SelectedItem) ' visualizzo l'importo estrapolato e comprensivo di eventuale quantitativo direttamente nella txteuro.text
         
   txteuro.Text = txteuro.Text
   val= txteuro.Text
   txteuro.Text = val & 0
   totalval = totalval + val
     txttotaleeuro.Text= NumberFormat2(totalval,1, 2, 2, False)
Dim k As Int
        k = txtmn6.Text.IndexOf(":") 'in questa txtmn6.text visualizzo l'intera stringa che va alla listview e cioè: 6 : scatole di tonno - Euro 4.50
        If k >= 0 Then
            txtlistview.Text = txtmn6.Text.SubString2(0,k)' su txtlistview.text ricavo il numero 6 delle scatole di tonno
        End If
End If
   spquantita.SelectedIndex = 0
   
End Sub

adesso devo ragionare sul totale perchè appena estrapolo dalla listview ad esempio le 6 scatole di tonno, questi non me li calcola in modo corretto, sicuramente sbaglio qualcosa in quest'altro codice

B4X:
Sub lswordine_ItemClick (Position As Int, Value As Object)

    mp1.Initialize
    mp1.Load(File.DirAssets,"clickok.mp3")
    mp1.Play
    Dim Selection As Short
    Selection = Msgbox2("Sei sicuro di voler cancellare l'elemento selezionato?".ToUpperCase, "A T T E N Z I O N E !!", "Si", "", "No", Null)
    Select Selection
        Case DialogResponse.POSITIVE

            ' qui sotto il codice che l'amico LucaMs mi ha fornito e che funziona davvero egregiamente. ______________________

            If Msgbox2(Value, "Confermi l'eliminazione di", "Sì", "Annulla", "No", Null) = DialogResponse.POSITIVE Then
                Dim Elemento As String = Value
                Dim Parole() As String = Regex.Split("Euro", Elemento)
                Dim Prezzo As Float = Parole(Parole.Length - 1)
                txttotaleeuro.Text = txttotaleeuro.Text - Prezzo
'____________________________________________________

'qui sotto il codice che ho aggiunto io___________________________
                txttotaleeuro.Text= Prezzo * txtlistview.Text ' da qui gli dico che il totaleeuro.text deve essere di txtlistview.text che sarebbe il quantitativo delle 6 scatole di tonno
                txttotaleeuro.Text = txttotaleeuro.Text - Prezzo ' da qui sottraggo dal totale il prezzo, però non mi da la sottrazione giusta delle 6 scatole di tonno.
' _______________________________________           
                lswordine.RemoveAt(Position)
                txteuro.Text=0
            End If

         
        Case DialogResponse.CANCEL, DialogResponse.NEGATIVE
    End Select
    Return True
End Sub
spero di riuscire a capirci qualcosa stasera al rientro a casa.
 
D

Deleted member 103

Guest
Boh, forse mit sbaglio, ma con il mio codice potresti andare da catania a roma direttamente senza passare, come fai tu , da Berlino. :D
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
alla fine con le mie poche conoscenze ho risolto in questo modo, so che non è un codice snello ma le mie capacità di programmazione sono limitate, questo il codice:
B4X:
Sub lswordine_ItemClick (Position As Int, Value As Object)
    txtordineinvisibile.Text=Value ' uso questa casella di testo per far apparire l'intera stringa che visuliazzo in un rigo della listview, esempio: 6: scatole di tonno - Euro 4.50
    scorpora' uso questa sub situata alla fine del codice.
    mp1.Initialize
    mp1.Load(File.DirAssets,"clickok.mp3")
    mp1.Play
    Dim Selection As Short
    Selection = Msgbox2("Sei sicuro di voler cancellare l'elemento selezionato?".ToUpperCase, "A T T E N Z I O N E !!", "Si", "", "No", Null)
    Select Selection
        Case DialogResponse.POSITIVE
           ' qui sotto utilizzo il codice fornitomi dall'amico LucaMs, adattandolo alle mie esigenze.
            If Msgbox2(Value, "Confermi l'eliminazione di", "Sì", "Annulla", "No", Null) = DialogResponse.POSITIVE Then
                Dim Elemento As String = Value
                Dim Parole() As String = Regex.Split("Euro", Elemento)
                Dim Prezzo As Float = Parole(Parole.Length - 1)
' fine del codice fornitomi da LucaMs ed inizio dell'adattamento per le mie esigenze.

                totalval = totalval - Prezzo * txtlistview.Text ' totalval è una variabile come Double
                totalval = totalval
                txttotaleeuro.Text= totalval              
                lswordine.RemoveAt(Position)
                txteuro.Text=0
            End If

          
        Case DialogResponse.CANCEL, DialogResponse.NEGATIVE
    End Select
    Return True
   
  
End Sub

Sub scorpora
  
    txtlistview.Text=txtlistview.Text ' aggiorno la casella di testo
    Dim k As Int
    k = txtordineinvisibile.Text.IndexOf(":")' cerco il riferimento dei due punti
    If k >= 0 Then
        txtlistview.Text = txtordineinvisibile.Text.SubString2(0,k)' inserisco nella casella di testo txtlistview.text il numero della quantità delle scatole di tonno ( 6: scatole di tonno - Euro 4.50 )
      
      
    End If
  
End Sub

l'unica cosa che non mi fa vedere in maniera chiara è il totale, cioè ad esempio al posto di vedere sulla casella di testo txttoaleeruo.text il prezzo, esempio: ( 22.50 ) lo visualizzo in questo modo ( 22.5 )dove sbaglio?
 
Last edited:
Top