104

C#、. NET 4.0、VS2010。

WPFの新機能。MainWindowにComboBoxがあります。上記のコンボボックスのSelectionChangedイベントをフックしました。ただし、イベントハンドラーでコンボボックスの値を調べると、古い値になっています。これは、SelectionChangedイベントというよりも、「SelectionChanging」イベントのように聞こえます。

選択が実際に行われた後、ComboBoxの新しい値を取得するにはどうすればよいですか?

現在:

this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);

...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = this.MyComboBox.Text;
}

イベント引数で渡されるオブジェクト、egeOriginalSourceを使用すると、同じ動作が得られることに注意してください。

4

17 に答える 17

117

MSDNによると、e.AddedItems

選択されたアイテムを含むリストを取得します。

したがって、次を使用できます。

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}

from :の値をSelectedItem使用する場合にも使用できます。stringItemssender

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (sender as ComboBox).SelectedItem as string;
}

また

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}

Contentとは両方ともオブジェクトであるため、代わりにSelectedItemを使用する方が安全です。.ToString()as string

于 2010-06-02T19:57:20.983 に答える
73

ここで確認する正しい値は、SelectedItemプロパティです。

ComboBox は、次の 2 つの部分を持つ複合コントロールです。

  1. The Text Part : この部分の値は、ComboBoxのTextプロパティに対応します。
  2. セレクター パーツ(つまり、「ドロップダウン」パーツ): このパーツで選択された項目は、SelectedItemプロパティに対応します。

拡張された ComboBox パーツ

上の画像は、ComboBox が展開された直後 (つまり、新しい値を選択する前) に取得されました。この時点で、ComboBox アイテムが文字列であると仮定すると、 TextSelectedItemの両方が "Info" になります。ComboBox 項目が "LogLevel" と呼ばれる Enum のすべての値である場合、SelectedItemは現在LogLevel.Infoになります。

ドロップダウンの項目をクリックすると、SelectedItemの値が変更され、SelectionChangedイベントが発生します。ただし、 SelectionChangedハンドラーが終了するまでテキスト パーツは更新されないため、Textプロパティはまだ更新されません。これは、ハンドラーにブレークポイントを設定し、コントロールを確認することで確認できます。

SelectionChanged ハンドラーのブレークポイントでの ComboBox

この時点ではテキスト パーツは更新されていないため、 Textプロパティは以前に選択された値を返します。

于 2015-07-22T21:43:02.053 に答える
52

コンボ ボックスの現在の値が必要な場合は、selectionChanged の代わりに DropDownClosed イベントを使用します。

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}

本当に簡単です。

于 2011-04-26T21:08:47.170 に答える
10

これは私のために働いた:

private void AppName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ComboBoxItem cbi = (ComboBoxItem)AppName.SelectedItem;
   string selectedText = cbi.Content.ToString();
}
于 2010-11-17T16:48:32.607 に答える
9

これは私のために働いた:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    var text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;            
}
于 2015-10-13T11:45:08.623 に答える
1
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}
于 2011-04-17T12:59:31.923 に答える
1

.Text 要素が範囲外だったため、2 番目のオプションは機能しませんでした (C# 4.0 VS2008)。これが私の解決策でした...

string test = null;
foreach (ComboBoxItem item in e.AddedItems)
{
   test = item.Content.ToString();
   break;
}
于 2010-08-24T21:52:14.423 に答える
0
private void indBoxProject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int NewProjID = (e.AddedItems[0] as kProject).ProjectID;
    this.MyProject = new kProject(NewProjID);
    LoadWorkPhase();
}

e.AddedItems[0] as kProjectこの明示的な区別を行う前に、デフォルトで RemovedItems[0] に設定されていたため、kProject がデータを保持するクラスであるの使用は私にとってはうまくいきました。この質問に答えてくれた最初の情報を提供してくれた SwDevMan81 に感謝します。

于 2016-04-21T14:10:54.790 に答える
0

これをVB.NETで解決する必要がありました。これが私が持っているもので、うまくいくようです:

Private Sub ComboBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ComboBox_AllSites.SelectionChanged
   Dim cr As System.Windows.Controls.ComboBoxItem = ComboBox1.SelectedValue
   Dim currentText = cr.Content
   MessageBox.Show(currentText)
End Sub
于 2010-11-22T20:17:01.453 に答える
0

SelectedItem が新しいデータを保持しているのに対し、SelectedValue が保持していないのは奇妙です。私にはバグのように聞こえます。Combobox 内の項目が ComboBoxItems 以外のオブジェクトである場合、次のようなものが必要になります: (my ComboBoxcontains KeyValuePairs)

var selectedItem = (KeyValuePair<string, string>?)(sender as ComboBox).SelectedItem;
if (!selectedItem.HasValue)
    return;

string selectedValue = selectedItem.Value.Value;  // first .Value gets ref to KVPair

ComboBox.SelectedItemKeyValuePairnull にすることはできますが、Visual Studio は aを null にすることはできないと言い続けます。そのSelectedItemため、 を nullableにキャストしKeyValuePair<string, string>?ます。次にselectedItem、 以外の値があるかどうかを確認しますnull。このアプローチは、選択したアイテムが実際にどのタイプであっても適用できるはずです。

于 2014-07-01T13:03:52.227 に答える
0

理由もなく物事を複雑にしないでください。SelectedValue プロパティを使用すると、選択した ComboBox の値を次のように簡単に取得できます: YourComboBoxName.SelectedValue.ToString()。

舞台裏では、SelectedValue プロパティは次のように定義されています。set;} これは、ComboBox の値を取得または設定するために使用できることを意味します。

SelectedItem の使用は、多くの影響を必要とするため、ComboBox 値を取得する効率的な方法ではありません。

于 2019-01-07T06:32:48.643 に答える
-3

これはあなたのために働くはずです...

int myInt= ((data)(((object[])(e.AddedItems))[0])).kid;
于 2013-10-24T22:32:11.990 に答える
-3

値が変更された直後に発生するため、DropDownClosed イベントを使用してこれを解決しました。

于 2015-06-19T15:45:14.687 に答える