【问题标题】:SelectedValue for a combobox returns an unexpected value组合框的 SelectedValue 返回意外的值
【发布时间】: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 =&gt; x["Work_Location"]).ToList();

标签: c# winforms


【解决方案1】:

您需要像这样将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 时,从SelectedValue 属性中获取DataRowView 对象是正常的。 Items 属性元素也是DataRowView 类型。

    为了获得组合框项的显示文本,可以使用GetItemText这样的方法

    int index = ...;
    var item = comboBox.Items[index];
    var text = comboBox.GetItemText(item);
    

    【讨论】:

      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2015-08-04
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多