Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Test su Listview

Ciao a tutti
Ho un problemino con un test da fare sugli elementi
di una Listview.
Ho una routine che aggiunge in una listview degli
utenti la cui estrazione avviene in altre parti del
programma.   La routine viene chiamata quindi
ogni volta che viene reperito un elemento, ma
siccome l'elemento potrebbe gia' essere stato
inserito in precedenza, voglio evitare che venga
inserito due volte (e poi non e' possibile, visto che
la key e' sempre la stessa).
Allora ho:
  k = "UT" & Format(UserCode, "000000")
se faccio:
  Set li = ListView1.ListItems.Add(, k)
funziona ma mi da errore se l'utente esiste gia'.
Se provo a verificare prima l'esistenza dell'item
  If ListView1.ListItems(k) Is Nothing Then ...
si pianta quando l'elemento k non esiste.
Come posso fare a testare l'esistenza di un item
con una key a mia discrezione senza generare
errori ?
Non voglio usare la tecnica dell'error trapping per
mie strane fissazioni etiche che non sto qui a dire...
Grazie
Ciao
Bepi

 mie strane fissazioni etiche che non sto qui a dire...
Purtroppo il metodo "ufficiale" e' proprio quello dell'error trapping, per
cui o ti crei una funzioncina tipo KeyExist() con dentro il un bel On Error,
in modo da tenerlo lontano dagli occhi e dal cuore :-), oppure devi per
forza duplicare qualche informazione da qualche altra parte... in questo
senso la cosa piu' economica che mi viene in mente e' copiare la Key nella
property Tag di ogni singolo ListItem appena aggiunto, in modo da poter
sfruttare il metodo FindItem cosi':
If ListView1.FindItem(strKey, lvwTag) Is Nothing Then ...
A questo punto, cosi' come con altre soluzioni analoghe, sei sempre a
rischio di disallineamento quindi occorre un minimo di attenzione.
Comprendo perfettamente le tue "fissazioni etiche", ma onestamente l'error
trapping incapsulato per bene in una funzione, non lo trovo cosi'
disdicevole... :-)
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

Ciao,
prepariamo l'ambiente:
Private Sub Command1_Click()
    Dim k As String, UserCode As Integer
    UserCode = Val(Text1)
    k = "UT" & Format(UserCode, "000000")
    If Controlla(k) Then
        MsgBox "Inserito"
    Else
        MsgBox "Già esistente"
    End If
End Sub
ora la funzioncina come la vuoi tu:
Function Controlla(Chiave As String) As Boolean
    Dim N As Integer, Li As ListItem
    If ListView1.ListItems.Count = 0 Then
            Set Li = ListView1.ListItems.Add(, Chiave, Chiave)
            Controlla = True
    Else
        For N = 1 To ListView1.ListItems.Count
            If ListView1.ListItems.Item(N).Key = Chiave Then Exit Function
        Next N
        Set Li = ListView1.ListItems.Add(, Chiave, Chiave)
        Controlla = True
    End If
End Function
ed ora spiegami i vantaggi ottenti in termini di tempo, lavoro macchina e
spazio rispetto a:
Function Controlla(Chiave As String) As Boolean
    Dim Li As ListItem
    On Error GoTo Fine
    Set Li = ListView1.ListItems.Add(, Chiave, Chiave)
    Controlla = True
Fine:
End Function
io credo che l'utilizzo delle gestioni errori sia corretto, oltre che utile,
fino a quando gli errori ti permettono di gestire in maniera ottimale
l'ambiente, mentre diventano sbagliate nel momento in cui ti servono solo a
rapezzare i buchi e le incognite di una programmazione non corretta.
Daltronde se il tuo purismo e la tua etica non ti consentono l'utilizzo di
queste tecniche, forse hai sbagliato sia l'ambiente di sviluppo, che la
piattaforma, visto che a detta di molti del NG (io compreso!!! ;o)) sia VB
sia Win sono un'accozzaglia di errori che si compensano!!!
Ma questo e' solo il mio modesto parere ...
beppe
-----------------------------------------------------------
Visita il sito del WWF AltoFerrarese
http://www.comune.cento.fe.it/wwfaf
-----------------------------------------------------------

Grazie ad entrambi per la vostra pazienza nelle
vostre esaurienti risposte.
In effetti per parlare di purismo e VB ci sarebbe
da fare interminabili dissertazioni, poi salterebbe
fuori il "giustiziere mascherato" (forse qualcuno
capisce a chi mi riferisco) e verrei come minimo
tacciato di trollaggine, il che e' fuori delle mie
intenzioni.
Per ora mi adeguero' ad usare l'error trapping,
volevo solo sapere se era l'unica soluzione.
Poteva essere che mi fosse sfuggito un qualche
metodo dell'oggetto ListView o qualche operosa
apina che mi permetteva di verificare l'esistenza
di una key in modo piu' elegante, ma se non c'e',
pazienza, vada per far incazzare il listview....
La soluzione di scorrere ogni elemento del
listview per ogni addnew e' una ciofeca peggio
dell'error trapping, quindi....
(Pero' voglio provare la soluzione del FindItem
proposta da Luca...)
Grazie
Ciao
Bepi

 ha scritto nel messaggio
news:9r637c$rojtd$1...@ID-56313.news.dfncis.de...


 trovare un elemento nella Lista .
Come ha detto Luca.   In effetti ho provato e funziona
alla grande.
Grazie a tutti
Bepi