2010-09-15 42 views
20

Mon WPF ComboBox contient uniquement des entrées de texte. L'utilisateur en sélectionnera un. Quel est le moyen le plus simple d'obtenir le texte du ComboBoxItem sélectionné? Veuillez répondre en C# et Visual Basic. Par ailleurs, je connais la réponse, mais ce n'était pas facile à trouver. Je pensais poster la question pour aider les autres. REVISION: J'ai appris une meilleure réponse. En ajoutant SelectedValuePath = "Content" en tant qu'attribut ComboBox, je n'ai plus besoin du code coulé laid. Voir la réponse d'Andy ci-dessous.Quel est le moyen le plus simple d'obtenir le texte sélectionné dans une liste déroulante contenant uniquement des entrées de texte?

+1

Si vous connaissez la réponse, n'hésitez pas à la poster aussi et la marquer comme réponse acceptée. Pas besoin que les autres fassent la même recherche deux fois. ;-) Et qui sait, peut-être que quelqu'un peut trouver une meilleure solution basée sur votre travail ... – Heinzi

+0

En ajoutant à ce commentaire, vous auriez pu facilement marquer votre question en tant que wiki de communauté. –

Répondre

43
<ComboBox 
    Name="cboPickOne" 
    SelectedValuePath="Content" 
    > 
    <ComboBoxItem>This</ComboBoxItem> 
    <ComboBoxItem>should be</ComboBoxItem> 
    <ComboBoxItem>easier!</ComboBoxItem> 
</ComboBox> 

Dans le code:

stringValue = cboPickOne.SelectedValue.ToString() 
+6

Autant que je voudrais que ce soit aussi propre et simple, cela seul ne fonctionne pas. SelectedValue renvoie un ComboBoxItem, pas la valeur de chaîne que je recherche. Placer ToString après SelectedValue renvoie ce System.Windows.Controls.ComboBoxItem: suivi du texte sélectionné. – DeveloperDan

+3

OK. Je vois que vous avez ajouté SelectedValuePath = "Content" en tant qu'attribut au ComboBox. Ça marche! Pas de casting moche requis. C'est gentil, propre et simple - juste ce que je voulais. Merci Andy! – DeveloperDan

+0

Vous pouvez également lier à SelectedValue.Content en tant que chemin, ce qui dissocie le comportement de ComboBox de l'exigence de la cible de liaison. – Sprague

0

Si vous connaissez déjà le contenu de votre ComboBoxItem vont seulement être des chaînes, accès seulement le contenu sous forme de chaîne:

string text = ((ComboBoxItem)cboPickOne.SelectedItem).Content.ToString(); 
0
var s = (string)((ComboBoxItem)cboPickOne.SelectedItem).Content; 

Dim s = DirectCast(DirectCast(cboPickOne.SelectedItem, ComboBoxItem).Content, String) 

Puisque nous savons que le contenu est une chaîne, je préférez un cast sur un appel de méthode ToString().

7

Juste pour clarifier Heinzi et Jim Brissom de réponses ici est le code dans Visual Basic:

Dim text As String = DirectCast(cboPickOne.SelectedItem, ComboBoxItem).Content.ToString() 

et C#:

string text = ((ComboBoxItem)cboPickOne.SelectedItem).Content.ToString(); 

Merci!

+1

Cela dépend si vous spécifiez explicitement les éléments en tant que ComboBoxItems ou via des liaisons directement en tant que chaînes. Dans le dernier cas '.Content' lancerait une exception je pense. –

-1

Utilisez la propriété DataRowView.Row.Item[Index] ou ItemArray[Index] pour obtenir le SelectedItem, où est l'indice de la colonne dans le DataTable utilisé comme itemSource pour le combobox. Dans votre cas, ce sera 0.Au lieu d'index, vous pouvez également passer le nom de la colonne aussi:

VB:

Dim sItem As String=DirectCast(cboPickOne.SelectedItem, DataRowView).Row.Item(1).ToString() 

C#

String sItem=((DataRowView)cboPickOne.SelectedItem).Row.Item[1].ToString(); 

Pour obtenir le SelectedValue vous pouvez utiliser:

VB:

Dim sValue As String=cboPickOne.SelectedValue.ToString() 

C#

String sValue=cboPickOne.SelectedValue.ToString(); 
+0

La question ne dit pas que les éléments de la 'ComboBox' sont de type' DataRowView'. –

1

Si vous ajoutez des éléments dans ComboBox

youComboBox.Items.Add("Data"); 

Utilisez ensuite ceci:

youComboBox.SelectedItem; 

Mais si vous ajoutez des éléments de liaison de données, utilisez ceci:

DataRowView vrow = (DataRowView)youComboBox.SelectedItem; 
DataRow row = vrow.Row; 
MessageBox.Show(row[1].ToString()); 
1

en utilisant cboPickOne.Text devrait donner vous la chaîne.

2

Je viens de le faire.

string SelectedItem = MyComboBox.Text;