【发布时间】:2016-03-11 23:41:03
【问题描述】:
我有一个在表单加载时填充的 ComboBox。我以数据集的形式从数据库中获取数据,并使用以下内容填充组合框。
checkBox4_combo.DataSource = ds.Tables[0].DefaultView.ToTable(true,"Work_Location");
checkBox4_combo.DisplayMember = "Work_Location";
checkBox4_combo.BindingContext = this.BindingContext;
但是,当我尝试访问此组合框的项目时,它返回了一个不需要的输出。
我尝试了以下方法:
方法一:
object ob = checkBox4_combo.Items[0];
MessageBox.Show(ob.ToString());
//Returns "System.Data.DataRowView"
方法二:
checkBox4_combo.SelectedIndex = 1;
object ob = checkBox4_combo.SelectedItem;
//OR
object ob = checkBox4_combo.SelectedValue;
MessageBox.Show(ob.ToString());
//Returns "System.Data.DataRowView"
方法三:
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 的 DataMember-Property 设置为您希望在 MessageBox 中看到的列。
-
数据表中的值是预期会改变还是会保持不变?因为在第二种情况下,您应该将给定的列转换为列表并使其成为数据源(列表,不太可能的数据表,是作为组合框数据源的理想类型,这就是它们会自动提供您想要的行为的原因)。跨度>
-
@varocarbas 不完全是,但他们有类似的东西 - ValueMember。我假设它作为 DataMember 工作
-
这不起作用,至少不是直接/以最合乎逻辑的方式。如果您想立即使用
checkBox4_combo.SelectedValue之类的内容获取显示的值,则必须依赖“更吸引人”的数据源,例如列表。 -
例如:
checkBox4_combo.DataSource = ds.Tables[0].DefaultView.ToTable(true,"Work_Location").AsEnumerable().Select(x => x["Work_Location"]).ToList();