2010-09-15 27 views
20

WPF ComboBox'um sadece metin girişleri içeriyor. Kullanıcı bir tane seçecektir. Seçilen ComboBoxItem öğesinin metnini almanın en kolay yolu nedir? Lütfen hem C# hem de Visual Basic'te cevap verin. İşte benim ComboBox:Seçilen metni yalnızca metin girişlerini içeren bir açılan kutuya almanın en kolay yolu nedir?

<ComboBox Name="cboPickOne"> 
    <ComboBoxItem>This</ComboBoxItem> 
    <ComboBoxItem>should be</ComboBoxItem> 
    <ComboBoxItem>easier!</ComboBoxItem> 
</ComboBox> 

Bu arada, cevabı biliyorum ama bulmak kolay değildi. Soruyu başkalarına yardım etmek için gönderirim diye düşündüm. REVİZYON: Daha iyi bir cevap öğrendim. Bir ComboBox özniteliği olarak SelectedValuePath = "İçerik" ekleyerek artık çirkin döküm koduna ihtiyacım yok. Aşağıdaki Andy'nin cevabına bakın.

+1

Cevabınızı biliyorsanız, postayla göndermekten çekinmeyin ve kabul edilen yanıt olarak işaretleyin. Başkalarının aynı araştırmayı iki kez yapmasına gerek yok. ;-) Kim bilir, belki birisi sizin işinize dayanarak daha iyi bir çözüm bulabilir ... – Heinzi

+0

Bu yoruma eklediğinizde, sorunuzu topluluk wiki olarak kolayca işaretleyebilirdiniz. –

cevap

43
<ComboBox 
    Name="cboPickOne" 
    SelectedValuePath="Content" 
    > 
    <ComboBoxItem>This</ComboBoxItem> 
    <ComboBoxItem>should be</ComboBoxItem> 
    <ComboBoxItem>easier!</ComboBoxItem> 
</ComboBox> 

:

stringValue = cboPickOne.SelectedValue.ToString() 
+6

Bu kadar temiz ve basit olmasını istediğim kadarıyla, tek başına çalışmaz. SelectedValue, aradığım dize değeri değil bir ComboBoxItem döndürür. SelectedValue sonra ToString yerleştirme, bu System.Windows.Controls.ComboBoxItem döndürür: sonra seçili metin. – DeveloperDan

+3

Tamam. ComedBox'a bir özellik olarak SelectedValuePath = "İçerik" eklediğinizi görüyorum. Bu işe yarıyor! Çirkin döküm gerekli değildir. Güzel, temiz ve basit - sadece ne istediğimi. Teşekkürler Andy! – DeveloperDan

+0

Ayrıca yol olarak SelectedValue.Content bağlayabilirsiniz, bu bağlayıcı hedefin gereksiniminden ComboBox davranışını ayırır. – Sprague

0

zaten ComboBoxItem içeriği yalnızca dizeleri olacak biliyorsanız, sadece dize olarak içeriğe erişmek:

string text = ((ComboBoxItem)cboPickOne.SelectedItem).Content.ToString(); 
0
var s = (string)((ComboBoxItem)cboPickOne.SelectedItem).Content; 

Dim s = DirectCast(DirectCast(cboPickOne.SelectedItem, ComboBoxItem).Content, String) 

içeriğin bir dize olduğunu biliyor beri, ToString() yöntem çağrısı üzerinden bir döküm tercih ederim.

7

Sadece burada Heinzi ve Jim Brissom cevapları netleştirmek için Visual Basic yılında kodudur:

Dim text As String = DirectCast(cboPickOne.SelectedItem, ComboBoxItem).Content.ToString() 

ve C#:

string text = ((ComboBoxItem)cboPickOne.SelectedItem).Content.ToString(); 

teşekkürler! kodunda

+1

Bu, öğeleri ComboBoxItems olarak açıkça belirtip belirtmediğinize veya doğrudan dizeler olarak bağlanmaya bağlı olmasına bağlıdır. İkinci durumda '.Content 'bence bir istisna atıyor. –

-1

Endeksi combobox için itemSource olarak kullanılan DataTable sütunun endeksidir SelectedItem almak için DataRowView.Row.Item[Index] veya ItemArray[Index] özelliğini kullanın. Senin durumunda 0 olacak.

VB: Yerine endeksi de ayrıca Sütun adını geçebilir

Dim sItem As String=DirectCast(cboPickOne.SelectedItem, DataRowView).Row.Item(1).ToString() 

C#

String sItem=((DataRowView)cboPickOne.SelectedItem).Row.Item[1].ToString(); 

kullanabilirsiniz SelectedValue almak için:

VB:

Dim sValue As String=cboPickOne.SelectedValue.ToString() 

C# Eğer

youComboBox.Items.Add("Data"); 

olarak ComboBox öğeleri eklerseniz

String sValue=cboPickOne.SelectedValue.ToString(); 
+0

Soru, "ComboBox" içindeki öğelerin "DataRowView" türünde olduğunu söylemez. –

1

O zaman bu kullanın: Veri bağlama öğeleri eklerseniz

youComboBox.SelectedItem; 

Fakat, bunu kullanın:

DataRowView vrow = (DataRowView)youComboBox.SelectedItem; 
DataRow row = vrow.Row; 
MessageBox.Show(row[1].ToString()); 
1

cboPickOne.Text'u kullanmalı sen dize

2

Sadece bunu yaptım.

string SelectedItem = MyComboBox.Text;