Principale utente con più risposte
Combobox con items aventi stessa 'descrizione'

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
Risposte
-
Ottimo,
se il tuo problema è risolto imposta il mio post come risposta del thread in modo da chiuderlo
Ciao
Alessio
- Contrassegnato come risposta Milanesi Stefano mercoledì 1 febbraio 2017 10:50
Tutte le risposte
-
Ciao,
il tuo problema sembra lo stesso riscontrato qui
suggeriscono alcune soluzioni, vedi se fanno al caso tuo
Ciao
Alessio
-
-
Ciao,
ho provato a spostare il tuo codice dall'evento SelectedIndexChanged a SelectionChangeCommitted
Private Sub cboColors_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboColors.SelectionChangeCommitted If cboColors.SelectedIndex >= 0 Then MessageBox.Show(CType(cboColors.SelectedItem, Colors).IDColor & " - " & CType(cboColors.SelectedItem, Colors).Description) End If End Sub
e sembra funzionare bene
Prova in questo modo
Ciao
Alessio
- Proposto come risposta vbMizio mercoledì 1 febbraio 2017 10:53
-
Ho provato e sembra proprio funzionare. Farò ulteriori verifiche (nell'ambiente di produzione), ma comunque ti ringrazio tantissimo.
Grazie ancora per l'aiuto!
ciao
Stefano
- Contrassegnato come risposta Milanesi Stefano mercoledì 1 febbraio 2017 10:48
- Contrassegno come risposta annullato Milanesi Stefano mercoledì 1 febbraio 2017 10:49
-
Ottimo,
se il tuo problema è risolto imposta il mio post come risposta del thread in modo da chiuderlo
Ciao
Alessio
- Contrassegnato come risposta Milanesi Stefano mercoledì 1 febbraio 2017 10:50