none
Combobox con items aventi stessa 'descrizione' RRS feed

  • Domanda

  • Salve a tutti!

    Volevo sottoporre questo problema inerente alla gestione di una combo box (windows form) popolata utilizzando il metodo "AddRange".

    Se nella combo vengono caricati elementi (items) con la stessa descrizione (value) anche se con IDs differenti riscontro un comportamento anomalo quando viene selezionato uno degli elementi "doppi" e successivamente viene spostato il focus sul campo successivo.

    Seguendo il codice qui sotto riportato, quando seleziono l'elemento "Red" (con ID = 3), viene correttamente scatenato l'evento SelectedIndexChanged della combo visualizzando il messaggio dell'elemento selezionato ("3 - Red"), ma quando mi sposto sul campo successivo (mouse e/o Tab) viene di nuovo eseguito l'evento SelectedIndexChanged e automaticamente viene selezionato l'item  "Red" con ID = 2. In questo caso al termine dell'"operazione" mi ritrovo selezionato un elemento diverso da quello che in realtà avevo scelto.

    Sbaglio qualche cosa? Qualcuno mi sa spiegare il perchè di questo comportamento?

    Di seguito il codice d'esempio:

    Public Class Form1

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Call LoadCbo()
        End Sub
        Private Sub LoadCbo()

            Dim LsColors As New List(Of Colors)

            Dim _Color As New Colors
            _Color.IDColor = 1
            _Color.Description = "White"
            LsColors.Add(_Color)

            _Color = New Colors
            _Color.IDColor = 2
            _Color.Description = "Red"
            LsColors.Add(_Color)

            _Color = New Colors
            _Color.IDColor = 3
            _Color.Description = "Red"
            LsColors.Add(_Color)

            _Color = New Colors
            _Color.IDColor = 4
            _Color.Description = "Green"
            LsColors.Add(_Color)

            cboColors.Text = ""
            cboColors.Items.Clear()
            cboColors.Items.AddRange(LsColors.Cast(Of Object).ToArray())
            cboColors.AutoCompleteMode = AutoCompleteMode.Suggest
            cboColors.AutoCompleteSource = AutoCompleteSource.ListItems

        End Sub

        Private Sub CboAssignment_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboColors.SelectedIndexChanged
            If cboColors.SelectedIndex >= 0 Then
                MessageBox.Show(CType(cboColors.SelectedItem, Colors).IDColor & " - " & CType(cboColors.SelectedItem, Colors).Description)
            End If
        End Sub
    End Class
    Public Class Colors

        Private _IDColor As Integer
        Private _Description As String


        Public Sub New()

            _IDColor = 0
            _Description = ""

        End Sub


        Public Property IDColor() As Integer
            Get
                Return _IDColor
            End Get
            Set(ByVal value As Integer)
                _IDColor = value
            End Set
        End Property
        Public Property Description() As String
            Get
                Return _Description
            End Get
            Set(ByVal value As String)
                _Description = value
            End Set
        End Property

        Public Overrides Function ToString() As String
            Return Description
        End Function

    End Class

    martedì 31 gennaio 2017 18:00

Risposte

Tutte le risposte