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那样操作。