Je viens de commencer à utiliser des formulaires WPF au lieu de formulaires Windows Forms. Dans un formulaire Windows Forms, je pourrais simplement faire:
ComboBox.SelectedValue.toString();
Et cela fonctionnerait bien.
Comment est-ce que je fais ceci dans WPF? Il ne semble pas avoir l'option.
J'ai trouvé une façon étrange de le faire par rapport aux anciennes formes WF:
ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();
Eh bien .. j'ai trouvé une solution plus simple.
String s = comboBox1.Text;
De cette façon, je reçois la valeur sélectionnée sous forme de chaîne.
Assurez-vous que vous avez 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é à l'aide de la propriété SelectedItem
:
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 est affiché 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 penses-tu 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, par exemple, une propriété appelée Name, procédez comme suit:
MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;
En variante dans le gestionnaire d'événements ComboBox SelectionChanged
:
private void ComboBoxName_SelectionChanged(object send ...
{
string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}
Résoudre ce problème est simple. Tout ce que j'ai fait est d'ajouter "SelectedValuePath" à mon code XAML et de le lier à la propriété de modèle que je souhaite renvoyer 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 manière dont la case est remplie. Si vous le faites en attachant un DataTable
(ou une autre collection) au ItemsSource
, vous pouvez attacher un gestionnaire d’événements SelectionChanged
à votre boîte dans le XAML, puis en l’utilisant. 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 celle-ci - l'une avait ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
, qui ressemble à 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)
. Cela aurait peut-être fonctionné, mais ce que j'ai choisi, c'est en fait la combinaison des deux écrits ci-dessus et je ne me souviens pas pourquoi j'ai évité .SelectedItem
, Si ce n'est que cela n'a pas dû fonctionner pour moi dans ce scénario.
Si vous remplissez la zone de manière dynamique ou avec des éléments ComboBoxItem
dans le menu déroulant directement dans le code XAML, il s'agit du 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à-bas. En effet, la sortie de SelectedValue
ressemble à ceci: System.Windows.Controls.Control: Some Value
. Au moins c'est ce que j'ai fait dans mon projet. Vous devez donc analyser votre Some Value
En dehors 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 manière dont vous remplissez la case, de la façon dont vous pouvez en récupérer la valeur. Une réponse pourrait être juste dans une circonstance et mauvaise dans l'autre.
Créez un événement SelectionChanged ComboBox 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);
}
J'avais un problème similaire et j'ai essayé plusieurs solutions suggérées dans ce fil de discussion, mais j'ai constaté que l'événement SelectionChanged était déclenché avant que l'élément ComboBox ne soit réellement mis à jour pour afficher la nouvelle sélection (c'est-à-dire qu'il indiquait toujours le contenu de la liste déroulante avant le changement. se produisant).
Afin de résoudre ce problème, j'ai constaté qu'il était préférable d'utiliser le paramètre e qui est automatiquement transmis au gestionnaire d'événements plutôt que d'essayer de charger la valeur directement à partir de la liste déroulante.
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 ComboBox en C #, utilisez:
Combobox.SelectedValue
Écris-le comme ceci:
String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
En fait, vous pouvez aussi le faire de la manière suivante.
Supposons que votre nom de ComboBox soit comboBoxA
. Ensuite, sa valeur peut être obtenue comme:
string combo = comboBoxA.SelectedValue.ToString();
Je pense que cela est maintenant pris en charge puisque votre question a cinq ans.
C'est le même principe.
Vous pouvez utiliser SelectedIndex et utiliser ComboBox.Items [SelectedIndex] .ToString (). Ou tout simplement ComboBox.SelectedItem et lancez-le à n'importe quel type dont vous avez besoin :)
si vous voulez obtenir la valeur et la valider, vous pouvez faire quelque chose comme ceci
string index = ComboBoxDB.Text;
if (index.Equals(""))
{
MessageBox.Show("your message");
}
else
{
openFileDialog1.ShowDialog();
string file = openFileDialog1.FileName;
reader = new StreamReader(File.OpenRead(file));
}
MsgBox(cmbCut.SelectedValue().ToString())