2015-12-07 5 views
1

У меня есть ComboBox, который заполняется при загрузке формы. Я получаю данные из базы данных в виде набора данных и использую следующее, чтобы заполнить поле со списком.SelectedValue для combobox возвращает непредвиденное значение

checkBox4_combo.DataSource = ds.Tables[0].DefaultView.ToTable(true,"Work_Location"); 
checkBox4_combo.DisplayMember = "Work_Location"; 
checkBox4_combo.BindingContext = this.BindingContext; 

Но, когда я пытаюсь получить доступ к элементам этого списка, он возвращает нежелательный результат. Я попробовал следующее:
Метод 1:

object ob = checkBox4_combo.Items[0]; 
MessageBox.Show(ob.ToString()); 
//Returns "System.Data.DataRowView" 

Способ 2:

checkBox4_combo.SelectedIndex = 1; 
object ob = checkBox4_combo.SelectedItem; 
//OR 
object ob = checkBox4_combo.SelectedValue; 
MessageBox.Show(ob.ToString()); 
//Returns "System.Data.DataRowView" 

Метод 3:

checkBox4_combo.SelectedIndex = 1; 
object ob = checkBox4_combo.SelectedText; 
MessageBox.Show(ob.ToString()); 
//Returns <blank> 

Но, если я использую:

checkBox4_combo.SelectedIndex = 1; 
object ob = checkBox4_combo.Text; 
MessageBox.Show(ob.ToString()); 

Я получу желаемый результат, но это означает, что выбранный текст будет изменен. Таким образом, по существу, я не хотел бы использовать это, и методы 2 & 3.

Теперь, кроме просить решение, я хочу понять, почему выход либо нулевой или «System.Data.DataRowView». Есть ли что-то в том, что я привязываю данные к combobox, что является проблемой? Или это так, как это работает, и я должен придерживаться своего последнего решения?

+2

пытается установить DataMember-свойство вашего Combobox к колонку вы хотите видеть в ваш MessageBox. –

+1

Являются ли значения в данных, которые могут измениться, или они останутся постоянными? Поскольку во второй ситуации вы должны преобразовать данный столбец в список и сделать его источником данных (списки, маловероятные типы данных, являются идеальными типами для источника данных combobox, и именно поэтому они автоматически доставляют желаемое поведение). – varocarbas

+0

@MarcoForberg Извините, но comboboxes в winforms не обладают таким свойством. – varocarbas

ответ

2

Вы должны бросить checkBox4_combo.SelectedItem к DataRowView так:

var ob = (DataRowView)checkBox4_combo.SelectedItem; 
MessageBox.Show(ob[0].ToString());//Change ob[0] to each column index that you want 
2

Я думаю, вы смешиваете, что вы видите (под контролем DisplayMember собственности) с тем, что вы получаете (под контролем ValueMember собственности). Когда вы используете DataTable в качестве источника данных и не указываете ValueMember, это нормально, чтобы получить DataRowView объект от SelectedValue. Items Элементы собственности также относятся к типу DataRowView.

Для того, чтобы получить текст на дисплея из элемента комбинированного окна, вы можете использовать GetItemText метод как этого

int index = ...; 
var item = comboBox.Items[index]; 
var text = comboBox.GetItemText(item); 
Смежные вопросы