對於 xxxDataSource 來說,支持綁定參數,包括 ControlParameter、CookIEParameter、SessionParameter、ProfileParameter 和 QueryStringParameter。假如參數值直接來自於應用程序變量或者通過某個方法返回呢?
查閱了關於參數基類 Parameter 類 似乎不支持此功能,有一個選擇就是擴展自己的 Parameter,但是工作量比大,本身使用 xxxDataSource 就是為了快速開發。
這裡采用比較“原始”方法:直接使用Web服務器控件都支持的綁定語法 <%# expression %>
先看下面這個 SqlDataSource ,其中的 SelectCommand 屬性,是通過動態綁定實現的,categoryId 是一個私有類字段。
<ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# "SELECT * FROM [Products] WHERE [CategoryID] = " + categoryId %>'> <%--動態綁定 SelectCommand 命令--%>
</ASP:SqlDataSource>
可以通過控件事件中改變類字段 categoryId 的值,然後調用 SqlDataSource1.DataBind() 計算此值,得出 SelectCommand
甚至可以綁定一個方法,處理一個比較復雜sql語句,並返回
<ASP:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# GetSelectCommandText() %>' > <%--動態綁定 SelectCommand 命令--%>
</ASP:SqlDataSource>
private string GetSelectCommandText()
{
string sql = "SELECT * FROM [Products]";
if (DropDownList1.SelectedValue != "") {
sql += " WHERE [CategoryID] = " + int.Parse(DropDownList1.SelectedValue);
}
return sql;
}
測試實例通過一個 DropDownList 改變 categoryId 的值
protected void DropDownList1_SelectedIndExchanged(object sender, EventArgs e)
{
categoryId = int.Parse(DropDownList1.SelectedValue);
SqlDataSource1.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand
GridVIEw1.DataBind();
SqlDataSource3.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand
GridVIEw2.DataBind();
}
其實,都是 ASP.Net 1.x 中數據綁定的應用而已,唯一需要注意的是,調用數據控件(如GridVIEw)的 DataBind 方法之前一定要先調用數據源控件(如SqlDataSource)的 DataBind() 方法。
完整代碼:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
<script runat="server">
protected int categoryId = 1;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) {
SqlDataSource1.DataBind();
SqlDataSource3.DataBind();
}
}
protected void DropDownList1_SelectedIndExchanged(object sender, EventArgs e)
{
categoryId = int.Parse(DropDownList1.SelectedValue);
SqlDataSource1.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand
GridVIEw1.DataBind();
SqlDataSource3.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand
GridVIEw2.DataBind();
}
private string GetSelectCommandText()
{
string sql = "SELECT * FROM [Products]";
if (DropDownList1.SelectedValue != "") {
sql += " WHERE [CategoryID] = " + int.Parse(DropDownList1.SelectedValue);
}
return sql;
}
</script>
<html XMLns="http://www.w3.org/1999/xHtml" >
<head runat="server">
<title>DataBindForSelectCommand2</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<ASP:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" AutoPostBack="true"
DataTextField="CategoryName" DataValueFIEld="CategoryID" OnSelectedIndexChanged="DropDownList1_SelectedIndExchanged">
</ASP:DropDownList>
<ASP:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
ProviderName="System.Data.SqlClient" SelectCommand="SELECT [CategoryID], [CategoryName] FROM [CategorIEs]">
</ASP:SqlDataSource>
<ASP:GridView ID="GridVIEw1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="SqlDataSource1" >
<Columns>
<ASP:BoundField DataFIEld="ProductID" HeaderText="ProductID" InsertVisible="False"
ReadOnly="True" SortExpression="ProductID" />
<ASP:BoundField DataFIEld="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
</Columns>
</ASP:GridVIEw>
<ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# "SELECT * FROM [Products] WHERE [CategoryID] = " + categoryId %>'> <%--動態綁定 SelectCommand 命令--%>
</ASP:SqlDataSource>
<ASP:GridView ID="GridVIEw2" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="SqlDataSource3" >
<Columns>
<ASP:BoundField DataFIEld="ProductID" HeaderText="ProductID" InsertVisible="False"
ReadOnly="True" SortExpression="ProductID" />
<ASP:BoundField DataFIEld="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
</Columns>
</ASP:GridVIEw>
<ASP:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# GetSelectCommandText() %>' > <%--動態綁定 SelectCommand 命令--%>
</ASP:SqlDataSource>
</div>
</form>
</body>
</Html>