在我们谈
SqlDataSource 对象的
CancelSelectOnNullParameter 属性之前,先来看看两个网页范例。
在数据的筛选手法上,我们经常会让用户从
DropDownList 控件中选取某一个选项,然后将符合该选项的数据记录显示于
GridView 控件中。图表
1 与图表
2 所示的网页都是采用此种作法来设计的,然而这两个网页存在一个最大的差异。以图表
1 所示的网页而言,如果您从
DropDownList 控件中选取
「请选择一个部门」选项(
也就是没有选择特定的部门),
则不会有任何数据显示于 GridView 控件中,事实上在这个时候,
GridView 控件根本不会显示出来。以图表 2 所示的网页而言,如果您从
DropDownList 控件中选取
「请选择一个部门」选项(
也就是没有选择特定的部门),
则所有部门的数据都会显示于 GridView 控件中。究竟要采用哪一种逻辑,端视用户的需求而定。不过我想大家对于第一个网页的设计方式肯定没有什么问题与意见,应该会较好奇第二个网页该如何设计。
我们必须声明在先,事实上,
如果完全自行撰写程序代码来提取数据,第二个网页根本也没什么特别的技巧可谈,问题就在于,如果我们要完全通过接口工具来设定以便善用 Visual Studio 2005 的开发接口的话,就需要用到一些技巧,其中当然也包括
SqlDataSource 对象的
CancelSelectOnNullParameter 属性。
图表1
图表 2
基本上,图表 2 所示的网页在设计上,必须注意下列关键技巧:
q 首先,必须如下所示,赋予
DropDownList 的第一个选项(也就是预设选项
「请选择一个部门」)的
value 属性一个空字符串:
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource1"
DataTextField="部门"
DataValueField="部门"
AppendDataBoundItems="True" Width="208px">
<asp:ListItem Selected="True" Value="">请选择一个部门</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource1"
DataTextField="部门"
DataValueField="部门"
AppendDataBoundItems="True" Width="208px">
<asp:ListItem Selected="True" Value="">请选择一个部门</asp:ListItem>
</asp:DropDownList>
q 用户从
DropDownList 控件中所选取的选项会指派给
GridView 控件之数据来源的
SqlDataSource 对象,以便以其作为
SELECT 陈述式之
WHERE 子句的筛选值来提取资料。大家必须了解的是,在预设状态下,如果控件参数的值为空字符串将会被视为NULL值(如图表
3 所示),再加上
SqlDataSource对象的
CancelSelectOnNullParameter 属性的默认值为
True,也就是说,如果控件参数为 NULL 值的时候,
SqlDataSource 对象将不会执行数据提取操作。
我们之前已经将 「请选择一个部门」选项的 value 属性设定成一个空字符串,因此当用户选取此选项时,控件参数将会是 NULL 值,因此并不会去提取数据。但是就我们的需求而言,却希望当用户从 DropDownList 控件中选取 「请选择一个部门」选项时仍然要去执行数据提取操作,欲达此目的,必须将作为 GridView 控件之 SqlDataSource 对象的 CancelSelectOnNullParameter 属性设定成 False。
我们之前已经将 「请选择一个部门」选项的 value 属性设定成一个空字符串,因此当用户选取此选项时,控件参数将会是 NULL 值,因此并不会去提取数据。但是就我们的需求而言,却希望当用户从 DropDownList 控件中选取 「请选择一个部门」选项时仍然要去执行数据提取操作,欲达此目的,必须将作为 GridView 控件之 SqlDataSource 对象的 CancelSelectOnNullParameter 属性设定成 False。
q 不过这样做还不够。最后一项设定,就是必须将作为
GridView 控件之
SqlDataSource 对象的
SELECT 陈述式改写如下:(请特别注意
WHERE 子句的写法)
SELECT [员工编号], [姓名], [性别], [目前薪资], [部门]
FROM [章立民研究室]
WHERE ( [部门] = IsNull(@部门, 部门))
SELECT [员工编号], [姓名], [性别], [目前薪资], [部门]
FROM [章立民研究室]
WHERE ( [部门] = IsNull(@部门, 部门))
我想大家看完本文以后,可能会觉得这样做很麻烦,事实上,有些时候自己撰写程序来完成各项数据存取作业反而会更加直接、明确、且简易,该采用何者,您就自个儿衡量吧!
图表 3