web-dev-qa-db-fra.com

Obtenir la valeur sélectionnée dans la liste déroulante en C # WPF

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.

58
Boardy

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();
72
Boardy

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.

79
Moile

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());
11
The Smallest

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();
10
Kuntal Ghosh

Que penses-tu de ceux-ci:

string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();
6
nrkz

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;
6
Benny

En variante dans le gestionnaire d'événements ComboBox SelectionChanged:

private void ComboBoxName_SelectionChanged(object send ...
{
    string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}
3
Oleg S.

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"/>
3
Myron William

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.

2
vapcguy

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);
}
2
Vinay Kumar

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();
}
1
Ben Broadley
private void usuarioBox_TextChanged(object sender, EventArgs e)
{
    string textComboBox = usuarioBox.Text;
}
1
Maxson Jordan

Pour obtenir la valeur de l'index sélectionné de la ComboBox en C #, utilisez:

Combobox.SelectedValue
0
basit raza

Écris-le comme ceci:

String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
0
MsDeveloper

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.

0
Mlarnt90

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 :)

0
Machinarius

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));
        }
0
Johan Camargo
MsgBox(cmbCut.SelectedValue().ToString())
0
Poramate