Metodo RemoveItem

di il
2 risposte

Metodo RemoveItem

Buongiorno,
ho realizzato una listbox (me.lbox_utente_ass) che viene popolata ricorrendo alla proprietà Rowsource che preleva dati da una query (proprietà RowSourceType= "Tabella/Query").
Inoltre ho due pulsanti: uno che aggiunge valori da un'ulteriore listbox (me.lbox_utente) e l'altro che permette di eliminare i valori selezionati da me.lbox_utente_ass, ricorrendo al metodo RemoveItem utilizzando il seguente codice:
Private Sub cmd_del_utente_Click()
Dim i As Integer
Me.lbox_utente_ass.RowSourceType = "Elenco valori"
If Me.lbox_utente_ass.ListCount > 0 Then
    For i = 0 To Me.lbox_utente_ass.ListCount - 1
      If Me.lbox_utente_ass.Selected(i) Then Me.lbox_utente_ass.RemoveItem (i)
    Next
Else
    Exit Sub
End If
End Sub
Il codice funziona in parte, ma quello che non capisco è il motivo per il quale se sono elencati, ad esempio, due valori elimina il valore selezionato, ma l'altro viene tramutata nella stringa "strSQL" utilizzata in:
me.lbox_utente.Rowsource = "strSQL"
ovvero il codice utilizzato per popolare la listbox utilizzata per aggiungere valori alla listbox nella quale sono operate aggiunte ed eliminazioni.
Grazie.

2 Risposte

  • Re: Metodo RemoveItem

    Diciamo che non funziona non che funziona in parte.
    Se la ListBox ha come RowSourceType = Tabella/Query, il RowSource è appunto un predicato SQL.
    Non puoi modificare Runtime il RowSourrceType come fai... perchè il Requery che viene generato, ripropone poi il RowSource salvato nell'Oggetto...

    Quindi la soluzione è questa, ipotizzando 2 Colonne, se sono di più adeguerai:
    Strutturi la ListBox in modalità RowSourceType="Elenco Valori", e su Load della Form, apri il rs e la popoli...
    
    Private sub Form_Load()
       Dim rs As DAO.Recordset
       Dim sRow  As String
       Set rs=DbEngine(0)(0).OpenRecordset("SELECT....",dbOpenSnapshot,dbReadOnly)
       If not(rs.bof AND rs.Eof) Then
          rs.moveFirst
          Do Until rs.Eof
              sRow=sRow & rs.Fields("Campo1") & ";" & rs.Fields("Campo1") & ";"   ' se vuoi usare AddItem devi modificare così:
              ' Me.lbox_utente_ass.AddItem  rs.Fields("Campo1") & ";" & rs.Fields("Campo1"), Indice ' quindi serve una Variabile Counter
              rs.MoveNext
          Loop
          ' ovviamente se usi AddItem questo non serve
          Me.lbox_utente_ass.RowSource=sRow
       End if
     End Sub
    Ho usato una stringa in quanto è discretamente più veloce del metodo AddItem che impatta sulla rigenerazione dell'Oggetto ad ogni iterazione, oltre che avere la piena retrocompatibilità fino ad Access2.

    A quel punto per cancellare usi un codice più scorrevole anche:
    
    Private Sub cmd_del_utente_Click()
        Dim vItem As Variant
        If Me.lbox_utente_ass.ListIndex < 0 Then Exit Sub
        
        For Each vItem In Me.lbox_utente_ass.ItemsSelected
            Me.lbox_utente_ass.RemoveItem (vItem)
        Next
    End Sub
    Saluti.
  • Re: Metodo RemoveItem

    Perfetto. Grazie tante.
Devi accedere o registrarti per scrivere nel forum
2 risposte