“无法绑定到数据源上的属性或列名称”,但列确实存在

问题描述

我有以下代码,应该在Windows窗体中的两个文本框中实现数据绑定:

private void GetData()
{
    bindingSourceStudies.DataSource = StudysTable;
    bindingSourceStudies.DataMember = "ID";

    txtName.DataBindings.Add(new Binding("Text",bindingSourceStudies,"Name"));  //#ERROR
    txtClass.DataBindings.Add("Text","Class");
}

但是,当我运行时,它在指示的行中失败,并显示错误消息:

    Cannot bind to the property or column Name on the DataSource.
Parameter name: dataMember

我知道此站点上有很多有关此特定错误的问题,但是,大多数问题(例如this one)都表明指定的列不存在或拼写错误。但是,正如您在下面看到的,BindingSource中显然存在名为"Name"的列,并且看起来拼写正确。

enter image description here

无论是否使用new Binding(...)语法,我都尝试过,但两种方法均失败。显然我缺少了什么,我在这里做错了什么?

解决方法

那不是.DataMember在BindingSource上的作用

  • 如果要将BindingSource绑定到DataTable,只需设置DataSource例如bindingSourceStudies.DataSource = StudysTable,根本不要设置DataMember

  • 如果将BindingSource绑定到DataSet(DataTable的集合),则设置.DataSource = theDataSetVariableName并同时设置.DataMember = "TheDataTableNameInsideTheDataSet"

  • 如果要显示相关数据,并且将此BindingSource设置为使其DataSource为另一个BindingSource,则也可以将.DataMember设置为DataRelation的名称

绑定文本框或其他内容时,在设置绑定时在其中设置“ ID”列绑定:

txtName.DataBindings.Add(new Binding("Text",bindingSourceStudies,"ID",true));
                                                                   ^^^^

将多个不同的文本框绑定到同一BindingSource上的不同列

BindingSources保持“当前记录”的概念-当绑定的基础绑定源的“当前”项发生更改时,所有绑定的控件将同步更改它们显示的内容。如果您使用多个绑定源,它们都将维护自己的“当前”概念


绑定,简单的方法:

  • 将新的DataSet类型文件添加到现有项目中
  • 向其中添加表(带有列),设置其数据类型等
  • 切换到您的表单设计器。打开Visual Studio的“查看”菜单,依次转到“ Windows” ,“数据源”
  • 展开其中的每个节点,并注意它们都有下拉菜单。打开一个下拉列表,看看
  • 将任何节点拖到表单上。 Voila,出现了(选择的控件类型),已经绑定到绑定源,已经绑定到带有数据集的数据表。拖动更多控件以绑定到同一BS等
  • 在数据集中的表之间添加数据关系。在“数据源”窗口中展开更多节点。将另一个节点的子节点拖到窗体上。请注意绑定到父绑定源的新绑定源的外观。现在,只要父级BS更改其正在查看的数据,子级BS就会过滤以仅显示其列表中当前父级的子级成员。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...