一、问题的提出
在ASP.NET 2.0/3.5编程中,当使用GridView、DataList、FormView等数据组件时,经常使用SqlDataSource作为它们的数据源组件,在简单情况下只需要简单地配置即可把二者联结到一起,但是在有些情况下,要恰当地实现二者的组合还是需要一定的技巧的。例如在本文情况下,在使用SqlDataSource数据源组件时,我们不是以简单的方式表达其SelectCommand参数内容。我们的想法是,使用Request.QueryString作为WHERE子句条件表达式的一部分,从而实现当从一个页面切换到另一个页面时可以根据从另一个页面传递过来的参数更灵活地控件SqlDataSource组件,进而达到更灵活地显示GridView、DataList、FormView等数据组件中内容的目的。
二、问题的进一步描述
首先,我们来看一下最简单或最一般的以GridView为代表的数据组件与SqlDataSource数据源组件搭配使用的例子,下面给出关键部分的代码片断:
<asp:GridViewID="GridView1"runat="server"AllowPaging="True"
AutoGenerateColumns="False"DataKeyNames="ST_l_id"
DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateFieldHeaderText="Select">
<ItemTemplate>
<inputid="LinkID"type="checkbox"runat="server"value='<%#
Eval("ST_l_id")%>'/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundFieldDataField="ST_l_id"HeaderText="Link
ID"InsertVisible="False"
ReadOnly="True"SortExpression="ST_l_id"/>
<asp:BoundFieldDataField="ST_l_name"HeaderText="Link
Name"
SortExpression="ST_l_name"/>
<asp:BoundFieldDataField="ST_l_url"HeaderText="URL"
SortExpression="ST_l_url"/>
</Columns>
</asp:GridView>
…………(省略)
<asp:SqlDataSourceID="SqlDataSource1"runat="server"
ConnectionString="<%$
ConnectionStrings:ConnectionString%>"
SelectCommand="SELECT
[ST_l_id], [ST_l_name], [ST_l_url] FROM [ST_link]"
DeleteCommand="DELETE
[ST_link] WHERE [ST_l_id] = @ST_l_id"
>
<DeleteParameters>
<asp:ParameterType="Int32"Name="ST_l_id"></asp:Parameter>
</DeleteParameters>
</asp:SqlDataSource>
上面的代码中,在SelectParameters或DeleteParameters子句中列举上面所使用的各个参数的名称及数据类型,显然这是只是使用了简单的<asp:Parameter>和</asp:Parameter>语句对。其实,远不止这些,为了更实现更灵活的编程,ASP.NET
2.0/3.5提供了其他更复杂的参数类型表达方式,例如下面所列举的多种类型:
n ControlParameter
指定的参数用于绑定到一个控件的属性或方法返回的值。
n CookieParameter
指定的参数用于绑定到一个Cookie的值。
n FormParameter
指定的参数用于绑定到当前Web表单页面的某一个属性。
n QueryStringParameter
指定的参数用于绑定到通过查询字符串(QueryString)传递到一个Web表单页面的值。
n SessionParameter
指定的参数用于绑定到一个Session变量的值。
n ProfileParameter
指定的参数用于绑定到一个ASP.NET用户配置(Profile)属性的取值。
在本短文中,我们仅来讨论使用Request.QueryString作为SqlDataSource数据源组件的WHERE子句条件表达式的一部分的情形。
三、举例
在本例中,我们要通过一个QueryString参数id(类型为int)把一个整型值传递到一个目标ASPX页面中,从而实现根据当前id参数的取值在指定的DataList数据控件中显示指定的数据。
于是,我们可以实现如下的表达:
<asp:DataListID="DataListLeft"runat="server"BackColor="LightGoldenrodYellow"
BorderColor="Tan"BorderWidth="1px"CellPadding="2"
DataSourceID="SqlDataSource1"Width="524px"ForeColor="Black">
<FooterStyleBackColor="Tan"/>
<AlternatingItemStyleBackColor="PaleGoldenrod"/>
<SelectedItemStyleBackColor="DarkSlateBlue"ForeColor="GhostWhite"/>
<HeaderStyleBackColor="Tan"Font-Bold="True"/>
<ItemTemplate>
<table>
<tr>
<td>Nick Name
</td>
<td>Content
</td>
</tr>
<tr>
<td><asp:LabelID="ST_r_nickLabel"runat="server"Text='<%#
Eval("ST_r_nick")%>'/>
</td>
<td><asp:LabelID="ST_r_contentLabel"runat="server"
Text='<%#
Eval("ST_r_content")%>'/>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<br/>
<asp:LabelID="lblMessage"runat="server"ForeColor="Red"></asp:Label>
…………(省略)
<asp:SqlDataSourceID="SqlDataSource1"runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString%>"
SelectCommand="SELECT [ST_r_nick], [ST_r_content] FROM [ST_replay]
Where ST_n_id=@ST_n_id"
>
<SelectParameters>
<asp:QueryStringParameter Name="ST_n_id"
QueryStringField="id" Type="Int32"/>
</SelectParameters>
</asp:SqlDataSource>
请重点关注上面代码中添加有浅绿色底纹的代码,这正是本文所要强调的表达方式。
尽管本文仅给出了片断代码,但是相信有ASP.NET 2.0(+)编程基础的朋友一眼能够明确上面的表达逻辑,在此恕不再赘述。