DataTable,DataView和DataGrid中一些容易混淆的(5)

经常有这种需求,一个窗体中有一个DataGrid,显示了一些数据,窗体上还有一些TextBox控件,用来显示DataGrid中的当前行的数据,一个TextBox控件对应DataGrid行的一个列,当DataGrid的当前行移动时,TextBox控件中的值也会跟着显示改变后的 DataGrid的当前行。
  
  要保证这些数据绑定控件保持同步就要一个统一管理数据绑定的机制来保证这些控件的同步,DotNet中负责数据同步的是 BindingManagerBase,它是用来管理数据源的,绑定到同一个数据源的数据绑定控件都可以由BindingManagerBase统一管理。BindingManagerBase可以由Form.BindingContext.Item属性获得,此属性有两种重载:
  
  public BindingManagerBase this[object DataSource] //获取与指定数据源关联的 BindingManagerBase
  public BindingManagerBase this[object DataSource, string DataMember] //获取与指定数据源和数据成员相关联的一个 BindingManagerBase
  
  所有的数据绑定控件的数据源同建立BindingManagerBase时传递的对象一样的,都将属于这个BindingManagerBase管理,比如,建立一个如下的BindingManagerBase:
  
  BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];
  
  如果Form上有个DataGrid的DataGrid.DataSource = myDataSet;DataGrid.DataMember = "customers",那么这个DataGrid的数据源就在myBindingManagerBaseParent的管理之下了。
  同样简单数据绑定的控件的DataSource也是跟 BindingManagerBase的DataSource一样,DataMember是BindingManagerBase的DataMember 指定的那个表的某一列时,这个控件的数据源也在这个myBindingManagerBaseParent管理之下了:
  
  dataGrid1.DataSource = myDataSet;
  dataGrid1.DataMember = "customers";
  textCustomerId.DataBindings.Add(new Binding("Text",myDataSet,"customers.customerid")); //TextBox的Text属性跟
   //myDataSet的customers表的customerid字段绑定
  
  BindingManagerBase控制的数据源有个当前行的概念,控件一旦跟数据源绑定后,DataGrid将显示数据源表的所有数据,不过在DataGrid的行标头里有个黑色的三角箭头用来指示当前行。简单绑定控件中显示的值将是数据源当前行的内容。
  
  所以,只要我们改变BindingManagerBase的指针就行了,这个可以在界面上通过点击要到的那一行来改变当前行,也可以在程序中改变当前行的设置:
  
  myBindingManagerBaseParent.Position = 10;
  
  BindingManagerBase.Position属性的变化就会引起BindingManagerBase当前行的变化,也就是跟这个数据源绑定的DataGrid的当前行的变化,简单绑定控件的显示内容也就随之改变了,如下图。
  
  figure-3
  当前行是第一行,上面的三个
  TextBox控件也显示第一行的数据
  
  
  figure-4
  当前行是第四行,上面的三个
  TextBox控件也显示第四行的数据
  
  BindingManagerBase的DataSource可以是DataSet,DataSet中可以有多个DataTable,这些 DataTable可以通过DataRelaton(关系)联系在一起,形成父表/子表的关系。比如,还是上面举过的例子,一个DataGrid显示 Customer表,同时还想要有一个DataGrid来显示当前Customer所有的order。这样我们就会需要两个 BindingManagerBase了,一个BindingManagerBase对应Customer表,另一个 BindingManagerBase对应order表,而且这个order表还要考虑到同Customer表的关系。
  
  对应Customer的BindingManagerBase上面我们已经建立好了,下面我们来建立对应order的BindingManagerBase:
  
  首先我们要建立Customer表和order表之间的关系myRelation:
  
  DataColumn ParentColumn = myDataSet.Tables["customers"].Columns["customerid"]; //要建立关系的父表的列,相当于主键
  DataColumn ChildColumn = myDataSet.Tables["orders"].Columns["customerid"]; //要建立关系的子表的列,相当于外键
来源:http://www.002pc.com/master/College/Programming/aspnet/13247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值