Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB2010] Assegnare indice ad una listbox

    Ciao a tutti,
    ho un dubbio sulla gestione delle listbox su VB2010.
    Si può assegnare un valore ad un item della listbox differente dal testo visualizzato?

    Es. se devo popolare la listbox con dati provenienti da database mi sarebbe molto utile poter visualizzare il campo descrittivo ma associare all'item l'id presente sul database.

    Sicuramente sarà una banalità ma non lo trovo da nessuna parte...

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Potresti memorizzare i due dati associati in un contenitore in modo che da uno risali all' altro.
    In questo caso puoi usare Dictionary:
    http://msdn.microsoft.com/it-it/libr...v=vs.100).aspx
    per memorizzare i dati chiave=testo e valore=id, con la proprietà Keys popoli la listbox e con una funzione, o quello che ti serve, ricavi l' id partendo dall' item della listbox.
    Ciao

  3. #3
    Potrebbe però verificarsi che il campo descrittivo sia identico ad un altro ma con un codice ID corrispondente diverso.

    Nella fattispecie la listbox verrà popolata con l'Oggetto di alcune email che vengono salvate sul DB, potrebbe verificarsi che due email abbiano lo stesso oggetto ma contenuto totalmente differente.

    quel che mi servirebbe sarebbe la cara struttura delle select di html dove all'interno della option posso indicare value="" e specificare separatamente il testo che voglio far visualizzare

    Non esiste in VB2010?

    Fabio

  4. #4
    Ciao, ma tu la ListBox la vuoi popolare manualmente o la popoli tramite un DataTable?
    Se la popoli tramite DT, non ti va bene impostare le proprietà:
    DataSource, DisplayMember e ValueMember?
    Jupynet

  5. #5
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Originariamente inviato da Skyscraper84
    Potrebbe però verificarsi che il campo descrittivo sia identico ad un altro ma con un codice ID corrispondente diverso.

    Nella fattispecie la listbox verrà popolata con l'Oggetto di alcune email che vengono salvate sul DB, potrebbe verificarsi che due email abbiano lo stesso oggetto ma contenuto totalmente differente.

    quel che mi servirebbe sarebbe la cara struttura delle select di html dove all'interno della option posso indicare value="" e specificare separatamente il testo che voglio far visualizzare

    Non esiste in VB2010?

    Fabio
    La chiave della Dictionary è univoca, se aggiungi un duplicato si genera un' eccezione, puoi andare di try/catch o verificare se contiene gìà la chiave.
    Quindi puoi modificare il valore/chiave "oggetto email" come preferisci.

  6. #6
    La popolo manualmente...
    Altrimenti potrei creare una Array e ad ogni inserimento di un nuovo item scrivo l'indice dell'item ed il relativo ID del DB corrispondente.

    Che ne pensate?

  7. #7
    Ci sono svariati modi per farlo.
    Oltre a quello che ti hanno suggerito, te ne propongo un paio.
    1) ti crei un datatable con i campi che ti servono e lo associ alla listbox(impostando DataSource, DisplayMember e ValueMember)
    Per aggiungere dati alla listbox basta che aggiungi una nuova riga al datatable e il valore lo recuperi con la proprietà: SelectedValue
    esempio:
    codice:
    Dim dt As DataTable
    Private Sub CreaDataTable()
            dt = New DataTable
            dt.TableName = "miaTabella"
            dt.Columns.Add("value", System.Type.GetType("System.String"))
            dt.Columns.Add("oggetto_email", System.Type.GetType("System.String"))
    End Sub
    
    Private Sub AggiungiRiga(value As String, oggetto As String)
            Dim riga As DataRow = dt.NewRow
            riga("value") = value
            riga("oggetto_email") = oggetto
            dt.Rows.Add(riga)
    End Sub
    2) ti crei una classe con le proprietà che ti servono a popolare la listbox, e usi la classe per popolare la listbox.
    Per recuperare il valore, basta fare un casting, dell'item selezionato, alla tua classe.
    esempio:
    codice:
    Public Class DatiListBox
        Private _value As String
        Private _oggetto As String
       
        '.....property per leggere le proprietà....
    
        Public Sub New(ByVal value As String, ByVal oggetto As String)
            _value = value
            _oggetto = oggetto
        End Sub
    
        Public Overrides Function ToString() As String
            Return _oggetto
        End Function
    
    End Class
    
    'aggiungi riga
    ListBox1.Items.Add(New DatiListBox("mio valore", "mio oggetto"))
    
    'recupera dati
    Dim item As DatiListBox = DirectCast(ListBox1.SelectedItem, DatiListBox)
    Ora non ti rimane che scegliere il metodo che più ti piace..
    Jupynet

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Potresti usare la List tipizzata e associare la lista al datasource della listbox. Poi col selectedvalue vai a prenderti il valore dalla listbox

  9. #9
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Originariamente inviato da Skyscraper84
    La popolo manualmente...
    Altrimenti potrei creare una Array e ad ogni inserimento di un nuovo item scrivo l'indice dell'item ed il relativo ID del DB corrispondente.

    Che ne pensate?
    Che è quello che ti ho proposto... ...solo che con l' array devi andare alla "ricerca" dei tuoi valori.

    X jupynet
    I tuoi esempi sono ottimi ma per come ho inteso il problema sono troppa roba..., nel senso che usando la Dictionary bastano poche righe di codice senza usare DataTable o Classi.
    Una volta popolata la Dictionary con (TKey, Value) = ("testo email", ID) per gli Items della listbox basta impostarne il DataSorce = la proprietà Keys.ToArray del dizionario, mentre in base all' Item selezionato si risale all' ID semplicemente con "dizionario(item della listbox selezionato)".
    codice:
        Private Sub Form1_Load() Handles MyBase.Load
            'simulazione lettura DB
            dizionarioAdd("qui", 1)
            dizionarioAdd("quo", 2)
            dizionarioAdd("qua", 3)
            dizionarioAdd("pippo", 4)
            dizionarioAdd("pippo", 5)
            dizionarioAdd("paperino", 6)
        End Sub
    
        Private Sub dizionarioAdd(ByVal ogg_email As String, ByVal ID As Integer)
            If dizionario.Keys.Contains(ogg_email) Then
                ogg_email = ogg_email & "(doppio)"
            End If
            dizionario.Add(ogg_email, ID)
            ListBox1.DataSource = dizionario.Keys.ToArray
        End Sub
    
        Private Sub Button1_Click() Handles Button1.Click
            Console.WriteLine(ottieniID)
        End Sub
    
        Private Function ottieniID() As Integer
            Return dizionario(ListBox1.SelectedItem)
        End Function

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.