web-dev-qa-db-ja.com

C#WPFのコンボボックスから選択した値を取得する

Windowsフォームフォームの代わりにWPFフォームの使用を開始しました。 Windows Formsフォームでは、次のことができます。

ComboBox.SelectedValue.toString();

そして、これはうまくいくでしょう。

WPFでこれを行うにはどうすればよいですか?オプションがないようです。

58
Boardy

古いWFフォームと比較して、少し奇妙な方法を見つけました。

ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();
72
Boardy

まあ..私はより簡単な解決策を見つけました。

String s = comboBox1.Text;

このようにして、選択した値を文字列として取得します。

79
Moile

XAMLファイルでComboBoxの名前が設定されていることを確認します。

<ComboBox Height="23" Name="comboBox" />

コードでは、SelectedItemプロパティを使用して選択したアイテムにアクセスできます。

MessageBox.Show(comboBox.SelectedItem.ToString());
11
The Smallest

私のXAMLは次のとおりです。

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

コンテンツは、テキストおよびWPFコンボボックスの名前として表示されます。選択したアイテムの名前を取得するには、次のコード行を使用します。

ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;

WPFコンボボックスの選択されたテキストを取得するには:

string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();
10
Kuntal Ghosh

これらはどうですか:

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

ComboBoxにバインドしたものによって異なります。 MyObjectというオブジェクトをバインドしていて、たとえばNameというプロパティが次のことを行っている場合:

MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;
6
Benny

ComboBox SelectionChangedイベントハンドラーのバリアントとして:

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

この問題の解決は簡単です。 XAMLコードに "SelectedValuePath"を追加し、コンボボックスで返すモデルプロパティにバインドするだけでした。

<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

これは、ボックスの充填方法に大きく依存します。 DataTable(または他のコレクション)をItemsSourceにアタッチすることにより行われる場合、XAMLのボックスにSelectionChangedイベントハンドラーをアタッチし、これをコードで使用することがあります。 -便利な後ろ:

private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cbx = (ComboBox)sender;
    string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
}

私はここで別の2つの答えを見ました-それは異なる部分を持っていました-1つはComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();を持っていましたが、これは似ていますが、ボックスをDataRowViewにキャストしません。 :((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();.Items.GetItemAt(comboBox1.SelectedIndex)の代わりに.SelectedItemを使用しました。それはうまくいったかもしれませんが、私が決めたのは実際には上記で書いた2つの組み合わせであり、.SelectedItemを避けた理由を覚えていません。ただし、このシナリオではうまくいかなかったはずです。

ボックスを動的に入力する場合、またはXAMLのドロップダウンにComboBoxItemアイテムを直接入力する場合、これは私が使用するコードです。

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());
}

cboParserがあります。これは、SelectedValueからの出力がSystem.Windows.Controls.Control: Some Valueのようになるためです。少なくとも私のプロジェクトではそうでした。そのため、Some Valueを解析する必要があります。

private static string cboParser(string controlString)
{
    if (controlString.Contains(':'))
    {
        controlString = controlString.Split(':')[1].TrimStart(' ');
    }
    return controlString;
}

しかし、これがこのページに非常に多くの答えがある理由です。それは、どのように値を元に戻すことができるかに関して、ボックスをどのように埋めるかによって大きく異なります。答えは、ある状況では正しいかもしれませんし、他の状況では間違っているかもしれません。

2
vapcguy

ComboBox SelectionChangedイベントを作成し、WPFデザインでItemsSource = "{Binding}"を設定します。

コード:

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
    MessageBox.Show(ob);
}
2
Vinay Kumar

私は同様の問題を抱えており、このスレッドで提案されたいくつかの解決策を試しましたが、ComboBoxアイテムが実際に更新されて新しい選択を表示する前にSelectionChangedイベントが発生していました発生)。

これを克服するために、コンボボックスから直接値をロードしようとするよりも、イベントハンドラーに自動的に渡されるeパラメーターを使用する方が良いことがわかりました。

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

C#でComboBoxの選択したインデックスの値を取得するには、次を使用します。

Combobox.SelectedValue
0
basit raza

次のように書きます:

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

実際には、次の方法でも実行できます。

ComboBox名がcomboBoxAであるとします。次に、その値は次のように取得できます。

string combo = comboBoxA.SelectedValue.ToString();

あなたの質問は5歳であるため、現在サポートされていると思います。

0
Mlarnt90

それは同じ原理です。

SelectedIndexとComboBox.Items [SelectedIndex] .ToString()を使用できます。または、単にComboBox.SelectedItemを使用して、必要な任意の型にキャストします:)

0
Machinarius

値を取得して検証したい場合は、次のようなことができます

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