Obtenir la valeur sélectionnée de la zone de liste déroulante en C # WPF
Je viens de commencer à utiliser des formulaires WPF au lieu des formulaires Windows Forms. Dans un formulaire Windows Forms, je pourrais simplement faire:
ComboBox.SelectedValue.toString();
Et cela fonctionnerait bien.
Comment puis-je faire cela dans WPF? Il ne semble pas avoir l'option.
20 réponses
Eh bien.. J'ai trouvé une solution plus simple.
String s = comboBox1.Text;
De cette façon, j'obtiens la valeur sélectionnée en tant que chaîne.
Je l'ai trouvé un peu étrange par rapport aux anciennes formes WF:
ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();
Assurez-vous d'avoir défini le nom de votre ComboBox dans votre fichier XAML:
<ComboBox Height="23" Name="comboBox" />
Dans votre code, vous pouvez accéder à l'élément sélectionné en utilisant SelectedItem
propriété:
MessageBox.Show(comboBox.SelectedItem.ToString());
Mon XAML est comme ci-dessous:
<ComboBox Grid.Row="2" Grid.Column="1" Height="25" Width="200" SelectedIndex="0" Name="cmbDeviceDefinitionId">
<ComboBoxItem Content="United States" Name="US"></ComboBoxItem>
<ComboBoxItem Content="European Union" Name="EU"></ComboBoxItem>
<ComboBoxItem Content="Asia Pacific" Name="AP"></ComboBoxItem>
</ComboBox>
Le contenu s'affiche sous forme de texte et le nom de la liste déroulante WPF. Pour obtenir le nom de l'élément sélectionné, j'ai suivi cette ligne de code:
ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;
Pour obtenir le texte sélectionné d'une liste déroulante WPF:
string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();
Que diriez-vous de ceux-ci:
string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();
Cela dépend de ce que vous avez lié à votre ComboBox. Si vous avez lié un objet appelé MyObject, et que vous avez, disons, une propriété appelée Name, procédez comme suit:
MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;
Résoudre ce problème est simple. Tout ce que j'ai fait était d'ajouter "SelectedValuePath" à mon code XAML et de le lier à ma propriété de modèle que je veux retourner avec la liste déroulante.
<ComboBox SelectedValuePath="_Department"
DisplayMemberPath="_Department"
Height="23"
HorizontalAlignment="Left"
ItemsSource="{Binding}"
Margin="-58,1,0,5"
Name="_DepartmentComboBox"
VerticalAlignment="Center"
Width="268"/>
Cela dépend en grande partie de la façon dont la boîte est remplie. Si cela est fait en attachant un DataTable
(ou une autre collection) au ItemsSource
, Vous pouvez trouver attacher un gestionnaire d'événements SelectionChanged
à votre boîte dans le XAML, puis l'utiliser dans le code-behind utile:
private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbx = (ComboBox)sender;
string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
}
J'ai vu 2 autres réponses ici qui avaient différentes parties de cela-l'une avait ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
, qui semble similaire mais ne jette pas la boîte à un DataRowView
, quelque chose que j'ai trouvé que je devais faire, et un autre: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
, utilisé .SelectedItem
au lieu de .Items.GetItemAt(comboBox1.SelectedIndex)
. Que cela aurait pu fonctionner, mais ce que j'ai réglé était en fait la combinaison des deux que j'ai écrit ci-dessus, et je ne me souviens pas pourquoi j'ai évité .SelectedItem
sauf que cela ne devait pas avoir fonctionné pour moi dans ce scénario.
Si vous remplissez la boîte dynamiquement, ou avec ComboBoxItem
éléments dans la liste déroulante directement dans le XAML, c'est le code que j'utilise:
private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbx = (ComboBox)sender;
string val = String.Empty;
if (cbx.SelectedValue == null)
val = cbx.SelectionBoxItem.ToString();
else
val = cboParser(cbx.SelectedValue.ToString());
}
, Vous verrez que j'ai cboParser
, là. C'est parce que la sortie de SelectedValue
ressemble à ceci: System.Windows.Controls.Control: Some Value
. Au moins il fait dans mon projet. Donc, vous avez à analysez votre Some Value
à partir de cela:
private static string cboParser(string controlString)
{
if (controlString.Contains(':'))
{
controlString = controlString.Split(':')[1].TrimStart(' ');
}
return controlString;
}
Mais c'est pourquoi il y a tant de réponses sur cette page. Cela dépend en grande partie de la façon dont vous remplissez la boîte, de la façon dont vous pouvez en récupérer la valeur. Une réponse peut être juste dans une circonstance, et fausse dans l'autre.
Créez un événement ComboBox SelectionChanged et définissez ItemsSource= "{Binding} " dans la conception WPF:
Code:
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
MessageBox.Show(ob);
}
Comme variante dans le gestionnaire D'événements ComboBox SelectionChanged
:
private void ComboBoxName_SelectionChanged(object send ...
{
string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}
J'ai eu un problème similaire et j'ai essayé un certain nombre de solutions suggérées dans ce thread mais j'ai trouvé que L'événement SelectionChanged se déclenchait avant que L'élément ComboBox ne soit mis à jour pour afficher la nouvelle sélection (c'est-à-dire qu'il donnait toujours le contenu de la combobox avant le changement).
Afin de surmonter cela, j'ai trouvé qu'il était préférable d'utiliser le paramètre e qui est automatiquement passé au gestionnaire d'événements plutôt que d'essayer de charger la valeur directement à partir du combo boîte.
XAML:
<Window.Resources>
<x:Array x:Key="Combo" Type="sys:String">
<sys:String>Item 1</sys:String>
<sys:String>Item 2</sys:String>
</x:Array>
</Window.Resources>
<Grid>
<ComboBox Name="myCombo" ItemsSource="{StaticResource Combo}" SelectionChanged="ComboBox_SelectionChanged" />
<TextBlock Name="MyTextBlock"></TextBlock>
</Grid>
C#:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string chosenValue = e.AddedItems[0].ToString();
}
private void usuarioBox_TextChanged(object sender, EventArgs e)
{
string textComboBox = usuarioBox.Text;
}
Pour obtenir la valeur de l'index sélectionné de la liste déroulante en C#, Utilisez:
Combobox.SelectedValue
C'est le même principe.
Vous pouvez utiliser SelectedIndex et utiliser ComboBox.Éléments[SelectedIndex].ToString (). Ou tout simplement ComboBox.SelectedItem et le lancer à n'importe quel type dont vous avez besoin:)
En fait, vous pouvez le faire de la manière suivante.
Supposons que le nom de votre ComboBox soit comboBoxA
. Sa valeur peut être obtenue comme:
string combo = comboBoxA.SelectedValue.ToString();
Je pense qu'il est maintenant supporté puisque votre question a cinq ans.
Écrivez-le comme ceci:
String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
XAML:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="19,123,0,0" Name="comboBox1" VerticalAlignment="Top" Width="33" ItemsSource="{Binding}" AllowDrop="True" AlternationCount="1">
<ComboBoxItem Content="1" Name="ComboBoxItem1" />
<ComboBoxItem Content="2" Name="ComboBoxItem2" />
<ComboBoxItem Content="3" Name="ComboBoxItem3" />
</ComboBox>
C#:
if (ComboBoxItem1.IsSelected)
{
// Your code
}
else if (ComboBoxItem2.IsSelected)
{
// Your code
}
else if(ComboBoxItem3.IsSelected)
{
// Your code
}
J'utilise ce code, et ça fonctionne pour moi:
DataRowView typeItem = (DataRowView)myComboBox.SelectedItem;
string value = typeItem.Row[0].ToString();
Cela fonctionne pour moi:
System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();