• 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那样操作。
  • 相关阅读:
    截图、贴图神器——Snipaste
    MySQL (InnoDB)在什么情况下无法使用索引
    美化博客园样式
    《快速阅读》全书脉络梳理
    MySQL 配置统计数据
    使用 MWeb + Typora 写作并发布到博客园
    浅谈操作系统的用户态和内核态
    一个后端工程师的开发软件
    程序写日志文件时该不该加锁 & PHP 写日志为什么加锁
    《小岛经济学》读书笔记
  • 原文地址:https://www.cnblogs.com/xxxteam/p/2878930.html
Copyright © 2020-2023  润新知