Newsgroup: it.comp.lang.visual-basic
Titolo: Scorrere listbox

Ciao,
 
ho la necessità di eseguire del codice dopo la selezione delle voci listbox :
 
Seleziono la 1° voce della lista
Eseguo un codice
 
Seleziono la 2° voce della lista
Eseguo un codice
 
e così via per tutte le voci.
Come posso fare?
Non so quante voci ha la listbox quindi dovrei credo contarle prima di scorrere l'elenco
grazie
Marco
 
PS VB 2005 Express

Ciao,
evento SelectedIndexChanged della listbox e sai quando e' stato scelto un 
altro elemento.
Andando a vedere la proprieta' ListBox1.SelectedItem sai quale elemento e' 
stato scelto.
A che serve contare prima?
In ogni caso, se proprio vuoi saperlo, una volta riempita la listbox, la 
proprieta' ListBox1.Items.Count ti restituisce il numero di elementi che hai 
inserito 
 

 inserito
 
Che tradotto in codice VB?
 
ho provato questo ma non funziona..
 
Dim i As Integer
        With ListNomeDb
            For i = 0 To ListNomeDb.listcount - 1
                Call ExportXls()
            Next
        End With
 
tra l'altro dice che .Listcount non  è un membro di System.Windows.Forms.ListBox!

 inserito
 
Che tradotto in codice?
 
ho provato così ma non va..
 
Dim i As Integer
        With ListNomeDb
            For i = 0 To ListNomeDb.listcount - 1
                Call ExportXls()
            Next
        End With
inoltre ListCount non è un membro di System.Windows.Forms.ListBox

Che tradotto in codice VB?
 
ho provato questo ma non funziona..
 
Dim i As Integer
        With ListNomeDb
            For i = 0 To ListNomeDb.listcount - 1
                Call ExportXls()
            Next
        End With
 
tra l'altro dice che .Listcount non  � un membro di 
System.Windows.Forms.ListBox!
....
E chi ha parlato di ListCount?
Io ho scritto Items.Count
 
Per altro il tuo codice, oltre al discorso di ListCount, fa una iterazione 
tra tutti gli elementi della listbox (ammesso che ListNomeDb sia la nostra 
listbox), quindi perche' dovrebbe essere necessario selezionare un item 
della listbox, se tu ogni volta cicli tutto?
Ci puoi spiegare meglio cosa intendi fare?
 

 Ci puoi spiegare meglio cosa intendi fare?
 
 
In pratica ho una query basata su un campo della form.
cosa voglio fare?
seleziono il primo elemento della listbox (ListNomeDb) così la query prende il suo parametro (appunto il nome della voce in lista).
Fatto ciò esporto i dati della query in excel
dopo devo fare lo stesso con le altre voci della lista
in pratica avrò un file excel per ogni voce della mia listbox
spero di averti chiarito ciò che desidero..

 spero di averti chiarito ciò che desidero..
 
Riorganizza il codice.... sicuramente hai difficoltà a riutilizzare le parti che ti interessano perchè stai scrivendo troppo direttamente negli eventi, e poco in funzioni separate; per quello vbMizio si chiedeva come mai dovevi per forza *selezionare* un elemento, per una cosa del genere dovrebbe bastare scorrere l'elenco e ottenere il valore, senza innescare una selezione lato interfaccia utente.
 
Andando un po' alla cieca, la cosa dovrebbe essere riorganizzata in maniera simile (pseudo codice):
 
Function EsequiQuery(parametro1, parametro2, ...)
[Qui scrivi codice che NON deve far riferimento a ListBox o altri controlli 
dell'interfaccia, deve prendere TUTTO quello che serve tramite parametri, e fare solo la parte di elaborazione dati (database, oggetti, quello che è...) e restituirla]
 
End Function
 
Event ListBox_SelectedIndexChenged()
 
[Qui usi il codice sopra in versione "singola", per quando l'utente appunto fa la selezione manuale]
 
Result = EsequiQuery(ListBox.SelectedItem)
[... il lavoro sui dati è finito, qui scrivi solo codice che aggiorna l'interfaccia per il singolo set di risultati, cosa che immagino non ti serve quando fai l'esportazione totale, e infatti è bene sia solo qui]
 
End Event
 
Function EsportaTutto()
[Qui usi il codice sopra in versione "batch", per ogni elemento della lista, senza bisogno di selezionarlo ma semplicemente prendendone il valore e usandolo per ottenere un set di risultati ad ogni iterazione]
 
For Each item As String In ListBox1.Items
   Result = EsequiQuery(item)
   [elabori questo set di risultati e passi al successivo]
Next
 
End Function

 End Function
 
Non ho capito molto di quanto hai scritto...
visto che l'export è già definito pubblicamente e mi basta richiamarlo con Call ExportXls, non basta fare una cosa di questo tipo?
 
For Each item As String In CmbNomeDb.Items
            Call ExportXls()
        Next
La query eviterei di modificarla in quanto la uso in altre parti del codice e funziona benissimo :
 
dbAdapterDGW = New OdbcDataAdapter("SELECT * FROM T_Errori WHERE NomeDatabase='" & CmbNomeDb.Text & "' and Data='" & TextBox1.Text & "'", dbConn)
 
anzichè usare una listbox potrei utilizzare la combo (CmbNomeDb) che uso per inserire i dati; questa contiene la lista dei db che a me serve..
 
basterebbe far comparire il nome del db (1° item) della combo poi aggiornare la query ed esportare. passare al 2° item della combo e così via...
 
 

Secondo me state dicendo due cose leggermente differenti...
Se non ho capito male, Luca ha in mente di esportare tutti gli "elementi" in 
un colpo solo, mentre, e correggetemi se sbaglio, Marco ha necessita' di 
esportare solo gli elementi della listbox che seleziona (altrimenti non si 
spiegherebbe l'utilizzo di una listbox)
Se e' come penso, dopo aver riempito la listbox con i vari elementi (ti 
ricordo che puoi inserire nella lista qualunque tipo di oggetto, e la 
rappresentazione di tali oggetti e' data da cio' che viene restituito 
chiamando il metodo .ToString dell'oggetto stesso), nell'evento
ListNomeDb.SelectedIndexChanged
puoi andare a "vedere" l'elemento selezionato tramite la proprieta' 
ListNomeDb.SelectedItem, la quale ti restituisce appunto l'oggetto scelto.
Nel tuo caso, ammesso che tu abbia riempito la listbox con tutti oggetti di 
tipo Stringa, farei una cosa del tipo:
Dim MiaStrunga As String = DirectCast(Me.ListNomeDb.SelectedItem, String)
poi chiamerei la funzione di esportazione, quella che hai chiamato 
"ExportXls", della quale pero' non mi convince la forma....
Vedo che questo metodo non accetta argomenti, quindi come fai a dire ad 
ExportXls, quale elemento deve esportare?
 

 spiegherebbe l&#39;utilizzo di una listbox)
 
Per come l'ho capita io, lui ha del codice esistente che prende i dati da DB in funzione del .SelectedItem della lista (come ha incollato sopra).
Ora vuole fare l'esportazione di tutto, ma siccome appunto il codice non è parametrizzato e legge direttamente i valori dell'interfaccia utente, vuole sapere come fare a selezionare via codice i singoli elementi del ListBox...
 
La soluzione di per se è banale (un ciclo in cui si imposta .SelectedIndex=i) ma mi sembra comunque una bruttura, e infatti anche tu più sopra ti chiedevi come mai dovesse materialmente "selezionarlo"

 ExportXls, quale elemento deve esportare?
 
ExportXls esporta quanto caricato in un DataGridView.
Per popolare il DataGridView eseguo una query nella quale la condizione Where punta alla combo contenente i nomi dei db (cmbNomeDb).
avevo quindi pensato, metto le stesse cose della combo in un ListBox che poi scorro.. è vero che posso fare lo stesso nella combo: 
seleziono la 1° voce della combo, popolo DataGridView ed esporto
seleziono la 2° voce della combo, popolo DataGridView ed esporto
seleziono la 3° voce della combo, popolo DataGridView ed esporto
e così via...
 
Volevo fare la cosa in automatico cioè passare tutte le voci una per una ed esportare. Sto leggendo un bel manuale di VB ma occorre tempo per imparare per cui forse è meglio che non vi rubo altro tempo e mi passo le voci della combo manualmente...

O, ora e' piu' chiaro, e l'interpretazione data da Luca e' quella corretta; 
avevo capito male io, forse anche perche' quello che vuoi fare e' un tantino 
macchinoso.
Facendo i vari passaggi...
1) Hai una routine che ti popola la Combo (all'inizio avevi parlato di 
ListBox, ma e' lo stesso) con tutti i nomi di database che hai disponibile
2) Vuoi ciclare tutti i db immessi nella combo per esportarli... non 
conviene esportare direttamente nel momento in cui popoli la combo? Ti 
risparmi un ciclo, del codice e tempo CPU
Spiego...
Ammettiamo che invece di usare dei nomi di db, debba tenere in 
considerazione (per farla semplice) dei numeri, ad ogni numero vuoi che 
venga eseguita una routine e contemporaneamente vuoi che questi numeri 
vengano anche mostrati nella tua combo. Io, anziche' riempire prima la combo 
con i numeri, poi riciclare tutti i numeri immagazzinati nella combo, 
preferirei una cosa tipo:
Dim I as Integer
For I = 1 to 10
    MiaCombo.Items.Add (I)
    ChiamaMiaFunzione (I)
Next I
 
Dove naturalmente ho definito una funzione che si chiama ChiamaMiaFunzione e 
che accetta come argomento il numero che voglio processare.
Sarebbe solo uno spreco di tempo, codice e risorse, dover fare un nuovo 
ciclo per tutti gli elementi della combo (ma mi sto ripetendo).
 

 ciclo per tutti gli elementi della combo (ma mi sto ripetendo).
 
Ora sono impegnato con un lavoro urgente, più tardi o lunedì valuterò la tua risposta e farò delle prove
Marco