问题描述
我有以下代码,应该在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"
的列,并且看起来拼写正确。
无论是否使用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就会过滤以仅显示其列表中当前父级的子级成员。