ASP.NET 1.x 中DataGrid的功能在ASP.NET 2.0中得到了增强。DataGrid增强的功能在2.0中分散到了GridView、DetailsView 和FormView 三个控件中。今天讨论一下GridView与DetailsView如何联合使用。
GridView和DetailsView的用法与1.x中有很大的不同,主要是2.0新增了4个DataSource控件。其中有3个直接或间接继承自System.Web.UI.DataSourceControl 另一个(SiteMapDataSource)继承自System.Web.UI.HierarchicalDataSourceControl。在实际应用中,用的较多的是ObjectDataSource。ObjectDataSource控件支持Web开发的三层架构,把表示层和数据层真正分开了。
ObjectDataSource允许指定一个类给它的TypeName属性。同时指定这个类的一个公共方法给它的SelectMethod属性。这可以是一个中间层的类,在这个类中可以调用数据层的方法也可以与数据层完全无关。与ObjectDataSource相连的GridView或DetailsView则只负责显示,而与数据逻辑无关。
要在GridView中显示数据只要把一个ObjectDataSource的ID赋给GridView的DataSourceID属性(实际上GridView中绑定的数据源只需要实现IEnumerable 或 ItypedList接口即可)。
![](http://download.cnblogs.com/images/cnblogs_com/chiewen/a.jpg)
在GridView的Smart Tag中有Choose Data Source的选项,可以选取页面中已存在的DataSource。选定DataSource后可以点击Configure Data Source,会出现下面的界面
![](http://download.cnblogs.com/images/cnblogs_com/chiewen/b.jpg)
![](http://download.cnblogs.com/images/cnblogs_com/chiewen/c.jpg)
1
void
Page_Load(
object
sender,EventArgse)
2![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
if(!Page.IsPostBack)
4![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
5
if(Page.User.IsInRole("Administrator"))
6![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
7
ObjectDataSource1.SortParameterName="sortParameter";
8
ObjectDataSource1.SelectMethod="GetStudents";
9
}
10
else
11![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
12
ObjectDataSource1.SelectParameters.Add(newParameter("Name",TypeCode.Int32,Page.User.Identity.Name));
13
ObjectDataSource1.SortParameterName="sortParameter";
14
ObjectDataSource1.SelectMethod="SelectStudent";
15
}
16
}
17
}
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
3
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
5
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
7
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
10
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
12
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
对于GridView的数据显示,一个常见的问题是:它根据什么生成行,又根据什么生成列呢?GridView需要的数据源只需实现IEnumerable 或 ItypedList接口。所以ObjectDataSource的select方法的返回值也必然要遵守几个条件:实现IEnumerable 或 ItypedList接口或直接是DataSet。如果返回值是DataSet,GridView会根据DataSet中的第一个Table生成行和列。否则,将枚举每一个返回值作为一行,并根据返回值的类型应用反射技术找出它的public属性作为列(前提是AltoGenerateColumn属性设为true)。例如:select方法返回类型是List<StrudentData>
StudentData类型有Name, Age, ID, Sex等属性,那么GridView就会将返回的每一个StudentData作为一行,并生成相应的Name, Age, ID, Sex列。
DetailsView如果想要显示GridView当中选定行的详细信息,则需要新建一个ObjectDataSource,这个ObjectDataSource的TypeName一般与第一个ObjectDataSource的TypeName相同,但是它的select方法应该与第一个ObjectDataSource的不同。不同之处在于这个select方法应该接收一个参数(一般应该是返回类型的主键),用以确定显示哪个实例的具体信息。
![](http://download.cnblogs.com/images/cnblogs_com/chiewen/d.jpg)
在接下来的Wizard中
![](http://download.cnblogs.com/images/cnblogs_com/chiewen/e.jpg)
在DetailsView中如果主键列不显示,也必须把主键列的列名赋值给DataKeyName属性(多个主键可以用逗号分开)。因为ViewState中只存放所显示列的值和在DataKeyName中指定的列的值。如果不赋值给DataKeyName的话,在DetailsView中使用Update、Delete方法的时候,主键列从ViewState中读取不到值,将会用默认值代替,这样就得不到想要的结果。
最后,介绍一下ObjectDataSource的DataObjectTypeName属性。我们在Update和Insert的时候往往需要多个参数代表对象的不同属性。这种做法首先容易出错,其次也不利于数据的封装。于是ObjectDataSource添加了一个DataObjectTypeName属性,这个属性确定了一个类,这个类可以封装要被修改或插入的值的全部属性值。在确定了这个属性后,在Update和Insert的函数中就可以用DataObjectTypeName属性定义的那个类作为参数类型。DataObjectTypeName的这种用法在下面的例子中可以看到。在调用在Update和Insert的时候,ASP.NET会自动实例化一个DataObjectTypeName属性定义的类型,并给它赋值,然后传给调用的函数。
做为DataObjectTypeName属性的类主要有以下三点要求:
1. 这个类必须有一个缺省的构造函数(就是0参数的构造函数)
2. 这个类的公有属性名必须和GridView或DetailsView所绑定的类的公有属性名相同
3. 这些公有属性必须get和set两种方法都具备。
经过上面的配置,GridView和DetailsView就可以配合使用了。下面是一个例子:
页面文件:
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
Default.aspx.cs
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://download.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://download.cnblogs.com/Images/dot.gif)