注意ADO.NET中容易混淆的概念(5)_.Net教程
推荐:解析asp.net开发与web标准的冲突问题Visual Studio .net从2003到现在的2008,一路走来慢慢强大从以前的vs2003能自动改乱你的html代码到现在在vs2008中都能直接对html代码进行w3c标准验证并提示了,非常不易。 论坛中也经常有从事.net开发的新手朋友问一些ASP.net开发过程中与Web标准之间的冲突
型。事实上,控件上的任何属性都可以绑定到数据库中的字段。
复杂数据绑定
复杂数据绑定指将一个控件绑定到多个数据元素的能力,通常绑定到数据库中的多条记录,或者绑定到多个任何其他类型的可绑定数据元素,一般是绑定到一个DataView。支持复杂绑定的控件的示例有DataGrid、ListBox 和 ErrorProvider 控件。
一般DataGrid控件都是跟一个DataView绑定,DataGrid的数据绑定属于复杂绑定,因为它绑定到有多条记录的表,DataGrid有两个属性同数据绑定有关:
DataGrid.DataSource 属性:获取或设置DataGrid所显示数据的数据源。一般是跟DataTable 、DataView 、DataSet 绑定,如果DataSource设定为DataSet,则引用包含的表不止一个,则必须向 DataMember 属性设置一个字符串,该字符串指定要绑定到的表。
DataGrid.DataMember 属性:获取或设置 DataSource中的特定列表,就是上述DataSource设定为DataSet时,要设定此属性来指定要绑定到的表。
经常有这种需求,一个窗体中有一个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的当前行的变化,简单绑定控件的显示内容也就随之改变了。
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"];
//要建立关系的子表的列,相当于外键
DataRelation myRelation = new DataRelation("myRelation",ParentColumn,ChildColumn,false);
//根据父表,子表的相关列建立关系
然后,通过关系,建立对应order表的BindingManagerBase:
myBindingManagerBaseChild = this.BindingContext[myDataSet,"customers.myRelation"]; //这个数据源将解析为一个父表中的客户对应的所有的order
这样,当对应Customer的BindingManagerBase的当前行改变时,对应order的BindingManagerBase也将跟着变化,他们之间的关系是由myRelation决定的
◆ 在程序中访问DataGrid中的内容
DataTable中有数据行DataRow,而在DataGrid中没有行这个对象,这让人感到很不习惯,也觉得不够自然。在DataTable中,一张表的层次结构很清楚,DataTable.Rows属性可以得到这张表所包含的所有行的行集,通过行集的索引DataRowCollection[index]就可以得到具体的一个DataRow,数据行的索引DataRow[index]又可以得到这一行的具体某一列的内容。
而DataGrid中就没有这么方便了,DataGrid只有两个属性可用,DataGrid.CurrentCell 属性,此属性返回一个DataGridCell类型的结构,DataGridCell结构指明此Cell所在的行号和列号。还有一个DataGrid.Item 属性,此属性有两个重载:
public object this[DataGridCell] //获取或设置指定的 DataGridCell 的值
public object this[int, int] //获取或设置位于指定行和列的单元格的值
可见,DataGrid中访问都是针对某个Cell进行的。经常的,我们需要从当前的Cell获得此Cell所对应的DataRow,比如界面中可能先选中DataGrid的某一行,或者某一个Cell,然后点击一个按钮,弹出一个新的窗口,窗口中显示这一行的所有单元的内容,并允许修改单元的值,最后保存关闭窗口。这就需要从当前的DataGrid所在的单元找到其所对应的DataTable所在的行和列。
而DataGrid中显示的数据可能经过DataView的DataView.RowFilter属性、DataView.RowStateFilter属性的过滤,还可能经过DataGrid本身根据各个列的正向和反向排序,所以DataGrid的CurrentRowIndex属性所指示的行索引跟其对应的DataTable的行索引有很大的机会是不一样的,不能够根据DataGrid的CurrentRowIndex去获取其对应的
分享:ASP.NET程序设计的10大技巧1. 在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字 .NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑。如果不愿意,我们并非一定要使用Visual Studio .NET作为集
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP发送Email实例(可带附件)
- js实现广告漂浮效果的小例子
- asp.net Repeater 数据绑定的具体实现
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
- Asp.net获取客户端IP常见代码存在的伪造IP问题探讨
- VS2010 水晶报表的使用方法
- ASP.NET中操作SQL数据库(连接字符串的配置及获取)
- asp.net页面传值测试实例代码
- DataGridView - DataGridViewCheckBoxCell的使用介绍
- asp.net中javascript的引用(直接引入和间接引入)
- 三层+存储过程实现分页示例代码
- 相关链接:
- 教程说明:
.Net教程-注意ADO.NET中容易混淆的概念(5)。