摘要:讀者 hwangtw 的問題與解答
問題
hwangtw
2007-05-27 11:39:02
再請問老師:
1.為何與CH3_DemoForm007類似的例子---CH3_DemoForm035
(我發現主要只差在後著的SqlDataSource ProductsDataSource是擺在較內層)
中CH3_DemoForm035.aspx.vb的下列三行:
Dim s As SqlDataSource = CType(e.Row.FindControl("ProductsDataSource"), SqlDataSource)
Dim r As System.Data.DataRowView = CType(e.Row.DataItem, System.Data.DataRowView)
s.SelectParameters("CategoryID").DefaultValue = r("類別編號").ToString()
改為類如原CH3_DemoForm007.aspx.vb有瑕疵語法的這一行:
Me.ProductsDataSource.SelectParameters("CategoryID").DefaultValue = DataBinder.Eval(e.Row.DataItem, "類別編號").ToString
就可以呢?
2.而修正後的CH3_DemoForm007.aspx.vb為何能修正呢?
可再說明些嗎?
謝謝!
解答
非常感謝您對章立民研究室的支持,關於您的問題,說明如下。
大家必須瞭解,要於執行階段取得資料值的手法本來就不只一種。其實我們在書中的不同範例是刻意使用下面兩種不同寫法,只不過未特別加以說明罷了:
' 第一道陳述式用於取得位於某資料行當中的 SqlDataSource 物件
Dim s As SqlDataSource = _
CType(e.Row.FindControl("ProductsDataSource"), SqlDataSource)
Dim r As System.Data.DataRowView = _
CType(e.Row.DataItem, System.Data.DataRowView)
s.SelectParameters("CategoryID").DefaultValue = _
r("類別編號").ToString()
-或-
Me.ProductsDataSource.SelectParameters("CategoryID").DefaultValue = DataBinder.Eval(e.Row.DataItem, "類別編號").ToString
重點是,CH3_DemoForm007.aspx 原先的瑕疵之處不在於取得所要篩選之資料值的手法,而在於資料來源繫結的時機。請注意,新版本的 CH3_DemoForm007.aspx 主要做了以下兩項修正:
q 將 SqlDataSource2 之 SELECT 陳述式中的 WHERE 子句移除。
q 沒有將 BulletedList1 繫結至 SqlDataSource2,而是完全利用 DataView 來動態設定 BulletedList1 的資料來源。
其實,原版本的 CH3_DemoForm007 也可以倣傚 CH3_DemoForm035.aspx 的寫法來加以修正。作法如下:
q 將 SqlDataSource2 移至「產品清單」資料行的 ItemTemplate 中。
q 將 GridView1_RowDataBound 事件處理常式改寫如下:
Protected Sub GridView1_RowDataBound( _
ByVal sender As Object, _
ByVal e As _
System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim s As SqlDataSource = _
CType(e.Row.FindControl("SqlDataSource2"), SqlDataSource)
s.SelectParameters("類別編號").DefaultValue = _
DataBinder.Eval(e.Row.DataItem, "類別編號").ToString
End If
End Sub
由於「ASP.NET AJAX 經典範例 100/使用 VB」一書的重點還是在於 AJAX 的部分,所以對於 ASP.NET 2.0 相關的技巧並不適宜做太多的解說,否則本書的厚度可能會達 1500 頁。此點,還請大家諒解。不論如何,還是非常感謝您的支持。
章立民研究室