223 messaggi dal 08 gennaio 2011
Ciao a tutti,
volendo associare un enumerazione ad un controllo capace di visualizzare elenchi, per esempio ComboBox, Listbox, DataGridView, ecc. ecc., avevo pensato di creare una classe ValoreEnumerazione composta da due proprietà, Nome e Valore per poi ottenere una list(Of ValoreEnumerazione) da passare ad esempio alla proprietà DataSource del controllo utilizzato per visualizzare e/o selezionare i valori dell'enumerazione.


Secondo voi questo approccio è valido o si puo fare di meglio ?


Grazie.
11.862 messaggi dal 09 febbraio 2002
Contributi
Sì, va bene, puoi usare il metodo GetNames dell'enum per ottenere tutti i nomi come array e poi darli in pasto al ComboBox come data source.

Eventualmente, se vuoi mostrare dei nomi più descrittivi, potresti porre un attributo [Description("...")] su ogni voce dell'enum. Lo vedi fare qui:
https://stackoverflow.com/questions/2650080/how-to-get-c-sharp-enum-description-from-value

ciao,
Moreno

Enjoy learning and just keep making
223 messaggi dal 08 gennaio 2011
Ciao Moreno, in questo codice
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = [Enum].GetNames(GetType(DistanzeFiliali))
        ComboBox2.DataSource = [Enum].GetNames(GetType(ComponentiCromatiche))
    End Sub
    Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedValueChanged
        Dim xd As DistanzeFiliali = [Enum].GetValues(GetType(DistanzeFiliali))(ComboBox1.SelectedIndex)
        Label1.Text = CInt(xd)
    End Sub
    Private Sub ComboBox2_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedValueChanged
        Label2.Text = ComboBox2.SelectedIndex
    End Sub
End Class
Public Enum DistanzeFiliali As Integer
    Roma = 432
    Milano = 749
    Torino = 876
End Enum
Public Enum ComponentiCromatiche As Integer
    Rosso = 0
    Verde = 1
    Blu = 2
End Enum

vengono utilizzate due enumerazioni. I valori numerici di DistanzeFiliali non sono in successione mentre quelli di ComponentiCromatiche si. Questa differenza comporta che, per ottenere il valore numerico di un membro dell'enumerazione dalla selezione tramite ComboBox, come si vede dal codice, si debba implementare un codice più complesso nel caso di DistanzeFiliali e più semplice nel caso di ComponentiCromatiche.

E' comunque vero che il codice utilizzato per ottenere il valore numerico di DistanzeFiliali funzionerebbe anche per ComponentiCromatiche.

Sarà il caldo  , che mi porta a fare queste considerazioni che forse sono inutili?.


Comunque, se dovesse risultare interessante, di seguito uno script di esempio di utilizzo di trasformazione di una enumerazione in una lista di oggetti di tipo MembroEnumerazione.
Molto interessante l'esempio di StackOverflow.
Ciao, Grazie.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = MembroDiEnumerazione.DaEnumerazioneALista(GetType(DistanzeFiliali))
        ComboBox1.DisplayMember = "ValoreAlfanumerico"
        ComboBox1.ValueMember = "ValoreNumerico"
    End Sub
    Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedValueChanged
        Dim xd As DistanzeFiliali = [Enum].GetValues(GetType(DistanzeFiliali))(ComboBox1.SelectedIndex)
        Label1.Text = CInt(xd)
    End Sub
End Class

Public Class MembroDiEnumerazione
    Private _ValoreAlfanumerico As String
    Private _ValoreNumerico As Long
    Public Sub New(n As String, v As Long)
        Me._ValoreAlfanumerico = n
        Me._ValoreNumerico = v
    End Sub
    Public ReadOnly Property ValoreAlfanumerico As String
        Get
            Return Me._ValoreAlfanumerico
        End Get
    End Property
    Public ReadOnly Property ValoreNumerico As Long
        Get
            Return Me._ValoreNumerico
        End Get
    End Property
    Public Shared Function DaEnumerazioneALista(ten As Type) As List(Of MembroDiEnumerazione)
        Dim l As New List(Of MembroDiEnumerazione)
        Dim vv As Long = Nothing
        For Each v As Object In ten.GetEnumValues
            vv = CLng(v)
            l.Add(New MembroDiEnumerazione(ten.GetEnumName(vv), vv))
        Next
        Return l
    End Function
End Class

Public Enum DistanzeFiliali As Short
    Roma = 432
    Milano = 749
    Torino = 876
End Enum

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.