Últimamente me estoy encontrando con problemas con código “viejo” que funcionaba perfectamente en las versiones “antiguas” de NET. pero que con el NET 10.0 no acaban de funcionar exactamente como deberían
Una de ellas es recuperar como texto el valor que muestra un ComboBox. El problema que tenia es que me devolvían juntos el nombre del objeto con el valor del combo.
Después de mirar código por ahí he encontrado la razón del problema
- El problema es como funciona realmente [ComboBoxEjemplo.SelectedItem.ToString()]
- SelectedItem devuelve el objeto realmente almacenado en el ComboBox, que es un ComboBoxItem, no un String. Hacer CType(..., String) lanza InvalidCastException porque no existe conversión directa.
Esta es la manera segura de hacerlo para (VB.NET):
- Obtén el texto desde ComboBoxItem.Conten
- Añade comprobaciones nulas.
- Alternativamente, configura ItemsSource con strings o fija SelectedValuePath="Content" para que SelectedValue sea directamente un string.
Código de ejemplo
Paso Uno – Leer el valor seleccionado de un ComboBox como texto
Objetivo: Quiero tener en una variable String, el valor que muestra el ComboBox
'---------------------------------------
' Leer el valor del ComboBox
Dim textoSeleccionadoEnElComboBox As String = String.Empty
If ComboBoxEjemplo.SelectedItem IsNot Nothing Then
' Obtener el valor[ComboBoxItem]
Dim cbItem = TryCast(ComboBoxEjemplo.SelectedItem,ComboBoxItem)
If cbItem IsNot Nothing Then
' Obtener el valor[ComboBoxItem.Content]
If cbItem.Content IsNot Nothing Then
' Obtener el valor[ToString]
textoSeleccionadoEnElComboBox = cbItem.Content.ToString()
End If
Else
' Caso de que los items del combo no sean ComboBoxItem
textoSeleccionadoEnElComboBox = ComboBoxEjemplo.SelectedItem.ToString()
End If
End If
'/Eof
'---------------------------------------
Paso Dos – Mostrar en el ComboBox un valor pasado por texto
Objetivo: Quiero que el ComboBox muestre (si existe en el ComboBox) el valor que tengo en una variable String. Si el valor no existe, se muestra el valor que se supone que es el valor NONE (normalmente es el valor cero (0), el primero de la lista)
'---------------------------------------
' Mostrar un valor en el ComboBox
'---------------------------------------
Dim TextoQueSePoneEnComboBox As String
' Este es el valor que se busca en el ComboBox para ponerlo como seleccionado
' sera el valor de una cadena que se recibe por ejemplo, a traves de un parámetro
TextoQueSePoneEnComboBox = "Un texto que exista en el ComboBox"
Dim encontrado As Boolean = False
Dim i As Integer = 0
Dim selectedTextDelBucle As String = String.Empty
' localizar si existe el valor[TextoQueSePoneEnComboBox] recorriendo el combo
' Bucle que recorre los Items del ComboBox
For i = 0 To ComboBoxEjemplo.Items.Count - 1
' Obtener el valor[ComboBoxItem]
Dim cbItem = TryCast(ComboBoxEjemplo.Items(i),ComboBoxItem)
If cbItem IsNot Nothing Then
' Obtener el valor[ComboBoxItem.Content]
If cbItem.Content IsNot Nothing Then
' Obtener el valor[ToString]
selectedTextDelBucle = cbItem.Content.ToString()
End If
Else
' Caso de que los items del combo no sean ComboBoxItem
selectedTextDelBucle = ComboBoxEjemplo.SelectedItem.ToString()
End If
' comprobar el valor leído del combo con el valor
' que quiero poner en el combo
If String.Equals(selectedTextDelBucle,
TextoQueSePoneEnComboBox,
StringComparison.CurrentCultureIgnoreCase)Then
' Existe, poner el valor en el combo usando el índice
ComboBoxEjemplo.SelectedIndex = i
encontrado = True
Exit For
End If
Next
If encontrado = False Then
' no se ha encontrado el valor guardado en el memento
' poner el valor por defecto
ComboBoxEjemplo.SelectedIndex = 0
End If
'/Eof
'---------------------------------------