1.按绑定的元素类型来分
1.1 集合绑定:即让BindingSource绑定给一个集合 / 表 / DataTable / List<T>
BindingSource bindingSourceToCollection = new BindingSource();
bindingSourceToCollection.DataSource = dataTable//绑定到一个DataTable
或者 dataSet.Table["tableName"]//同上
或者 parentBindingSource //绑定到一个父级绑定项目以实现复杂绑定
//把数据显示到DataGridView
this.dataGridView.DataSource = bindingSourceToCollection;
1.2 单个元素绑定,即让BindingSource绑定到一行 / row / object
BindingSource bindingSourceToRow = new BindingSource();
bindingSourceToRow.DataSource = row//绑定到一个DataRow
或者 dataTable.Rows[2]//同上
或者 (bindingSourceToCollection.Current as DataRowView).Row//同上
2.按关系绑定
2.1 同1.1
2.2 存在两张关系表:父表与子表。绑定他们的关系,以实现控件数据的自动跟踪。
绑定方向:父表 -> 子表。
父表:
struct Table_Class
{
ID : int,主键,自增
ClassName : string(50), 非空
}
BindingSource bindingSource_class = new BindingSource();
bindingSource_class.DataSource = table_class;
//把Table_Class里的数据全部显示到ComboBox里
this.comboBox.DataSource = bindingSource_class;
this.comboBox.ValueMember = "ClassName";
this.comboBox.DisplayMember = "ClassName";
子表:
struct Table_Student
{
ID : int, 主键, 自增
StudentName : string(50), 非空
ClassID : int, 外键(Table_Class的ID,外键名为【FK_ClassID_StudentID】)
}
BindingSource bindingSource_student = new BindingSource();
bindingSource_student.DataSource = bindingSource_class;
bindingSource_student.DataMember = "FK_ClassID_StudentID";
//把ComboBox中选中的班级的所有学生,显示在DataGridView中
this.dataGridView.DataSource = bindingSource_student;
2.3 同2.2,如果绑定方向为 子表 -> 父表,则需要使用自定义查询功能。
父表:
struct Table_Class
{
ID : int,主键,自增
ClassName : string(50), 非空
}
BindingSource bindingSource_class = new BindingSource();
bindingSource_class.DataSource = table_class;
子表:
struct Table_Student
{
ID : int, 主键, 自增
StudentName : string(50), 非空
ClassID : int, 外键(Table_Class的ID,外键名为【FK_ClassID_StudentID】)
}
BindingSource bindingSource_student = new BindingSource();
bindingSource_student.DataSource = table_student;
//把ComboBox中选中的班级的所有学生,显示在DataGridView中
this.dataGridView.DataSource = bindingSource_student;
//在TextBox中,显示在DataGridView中选定学生的班级名称
int 父表ID = (int)((bindingSource_student.Current as DataRowView).Row as DataRow).ItemArray[2];
bindingSource_class.Filter = "ID = " + 父表ID.ToString();
//从这个例子可见,Filter可以实现自定义WHERE条件子句,因此,就有了2.4的解决方案。
//但由于使用条件子句,进行查询后,结果可能有一个或多个。因此,如果进行单个元素的绑定,例如1.2,则需要用LIMIT 或 TOP来限制查询到的数据数量。
2.4 复杂关联:多个有关系或无关系的表,进行查找。
2.4.1 为每个表,创建一个BindingSource,并绑定到该表
2.4.2 写sql的WHERE后面的查询语句。比如,SELECT * FROM Table_Class WHERE ID = @ID
2.4.3 把WHERE条件,作为Filter属性,赋值给BindingSource实例。就如2.3那样操作。