BindingSource的复杂绑定:关系绑定与自定义绑定

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

 

你可能感兴趣的:(source)