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

 

posted on 2013-01-27 17:09  xxxteam  阅读(1333)  评论(0编辑  收藏  举报

导航