ASP.NET2.0快速入门系列--高级数据方案(上)
http://www.asp.net/QuickStart/aspnet/doc/data/advanced.aspx
高级数据方案
本主题描述如何使用数据控件的一些不太明显的功能实现高级方案。
处理空值
数据控件支持各种处理空数据或缺少数据的方法。首先,GridView、FormView 和 DetailsView 全都支持一个 EmptyDataText 或 EmptyDataTemplate 属性,当数据源没有返回数据行时,可以使用该属性为控件指定一种呈现。只需设置 EmptyDataText 和 EmptyDataTemplate 之一(当同时设置两者时,EmptyDataTemplate 优先)。还可以在 BoundField(以及派生字段类型)、TemplateField 或数据源参数对象上指定一个 ConvertEmptyStringToNull 属性,以指定在调用关联的数据源操作之前,应将从客户端发送的 String.Empty 值转换为空值。ObjectDataSource 还支持一个 ConvertNullToDbNull 属性,当关联的方法需要 DbNull 参数而不是空值时,可将该属性设置为 true(Visual Studio 数据集中的 TableAdapter 类有此要求)。还可以在 BoundField(以及派生字段类型)上指定一个 NullDisplayText 属性,以便在数据源中返回的字段值为空值时,为该字段指定要显示的值。如果该值在编辑模式期间未更改,则它将在一个 Update 操作期间作为空值返回数据源。最后,还可以在数据源参数上指定一个 DefaultValue 属性,以便在传递的参数值为空值时,为参数指定一个默认值。这些属性可产生链式效应,例如如果同时设置 ConvertEmptyStringToNull 和 DefaultValue,则 String.Empty 值首先被转换为空值,随后被转换为默认值。
C# Handling Null Values
可以使用这些空值处理属性实现 DropDownList 筛选器,它最初显示来自数据源的所有值,直至选择一个筛选器值。这是通过向 DropDownList 添加一个具有空字符串值的项,并设置数据源中的 DropDownList 所关联的 ControlParameter 上的 ConvertEmptyStringToNull 属性来实现的。然后,您可以在数据源 SelectCommand 中检查空值以便返回所有(未筛选的)值。下面的示例使用一个简单的 SQL 命令演示此项技术,不过您也可以在存储过程的实现中执行空值检查。请注意 DropDownList 的 AppendDataBoundItems 属性的使用,该属性允许将从 DropDownList 数据源获得的值追加到 Items 集合中静态添加的“ALL”项。还要注意,如果传递给 SelectCommand 的任何关联参数为空,则 SqlDataSource 默认不执行 Select 操作。若要允许 Select 操作即使在传递了空参数时也要执行,可以将 CancelSelectOnNullParameter 属性设置为 false。
C# Show All Values on Null Selection
高级主/详细信息方案
在本教程前面的主题中,您看到了如何通过将 ControlParameter 关联到 GridView 的 SelectedValue 属性来实现主/详细信息方案。SelectedValue 属性返回 DataKeyNames 属性指定的第一个字段的值。还可以为 DataKeyNames 属性指定用多个逗号分隔的字段值,例如,如果需要将多个值传递给主/详细信息方案中的详细信息数据源,便可以这样做。这些附加键字段的值通过 SelectedDataKey 属性公开,该属性返回键字段的名称/值对的 DataKey 对象。ControlParameter 甚至能够通过将 PropertyName 属性设置为一个表达式来引用这些键,例如 SelectedDataKey.Values("title_id"))。
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
下面的示例演示枚举 DataKeys 集合和用于从 GridView SelectedDataKey 获得键字段值的代码。
C# DataKeys
本教程前面的主/详细信息示例将详细信息控件显示为窗体上的一个单独的控件,但是另一种实现主/详细信息的常用方法是将详细信息控件显示为属于主控件呈现的一部分的嵌套控件。为此,您需要同时将详细信息控件及其关联的数据源包含在主控件的模板中,并使用一个数据源参数从主数据源的一个字段获得数据源的值。由于没有声明性参数对象能够以这种方式关联,您必须在代码中以编程方式设置该参数值。为此,您可以处理主控件上的一个事件,以便在主控件的某个项与数据绑定时设置该参数值,例如在 FormView DataBound 事件中。下面的示例演示了此项技术。
C# Nested Master-Details
下一个示例使用 DataList 演示一种类似的技术,它处理 DataList ItemDataBound 事件以设置详细信息数据源参数值。
C# Nested Master-Details (DataList)